Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>This depends on what you want to do, however, if you are primarily interested in the text between two bookmarks, then this is one of those cases where XmlDocument / XPath semantics are easier to use than LINQ to XML or the strongly-typed object model of the Open XML SDK V2. The semantics of the 'following::*' axis of XPath is what you want. The following example uses XmlDocument and XPath to print the names of the nodes between the start and end of a bookmark.</p> <pre><code>using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Xml; using DocumentFormat.OpenXml.Packaging; using DocumentFormat.OpenXml.Wordprocessing; class Program { public static XmlDocument GetXmlDocument(OpenXmlPart part) { XmlDocument xmlDoc = new XmlDocument(); using (Stream partStream = part.GetStream()) using (XmlReader partXmlReader = XmlReader.Create(partStream)) xmlDoc.Load(partXmlReader); return xmlDoc; } static void Main(string[] args) { using (WordprocessingDocument doc = WordprocessingDocument.Open("Test.docx", false)) { XmlDocument xmlDoc = GetXmlDocument(doc.MainDocumentPart); string wordNamespace = "http://schemas.openxmlformats.org/wordprocessingml/2006/main"; XmlNamespaceManager nsmgr = new XmlNamespaceManager(xmlDoc.NameTable); nsmgr.AddNamespace("w", wordNamespace); XmlElement bookmarkStart = (XmlElement)xmlDoc.SelectSingleNode("descendant::w:bookmarkStart[@w:id='0']", nsmgr); XmlNodeList nodesFollowing = bookmarkStart.SelectNodes("following::*", nsmgr); var nodesBetween = nodesFollowing .Cast&lt;XmlNode&gt;() .TakeWhile(n =&gt; { if (n.Name != "w:bookmarkEnd") return true; if (n.Attributes.Cast&lt;XmlAttribute&gt;().Any(a =&gt; a.Name == "w:id" &amp;&amp; a.Value == "0")) return false; return true; }); foreach (XmlElement item in nodesBetween) { Console.WriteLine(item.Name); if (item.Name == "w:bookmarkStart" || item.Name == "w:bookmarkEnd") foreach (XmlAttribute att in item.Attributes) Console.WriteLine("{0}:{1}", att.Name, att.Value); } } } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload