gpt4 book ai didi

c# - 字 OpenXML 。在书签之间遍历 OpenXmlElements

转载 作者:太空狗 更新时间:2023-10-30 01:28:00 26 4
gpt4 key购买 nike

我需要遍历书签开始和书签结束标记之间的节点。问题似乎分解为树遍历,但我无法确定正确的算法。书签开始和结束元素是非复合节点(没有子节点)并且可能出现在树中的任意深度。书签开始也不能保证在相同的深度。

如果您为文档绘制树结构,我想检查开始和结束书签之间的所有节点。我认为遍历从节点 x 开始到节点 y 结束的不平衡树的算法是可行的。这听起来可行还是我遗漏了什么。

如果这可行,您能否指出可以完成返回节点的树遍历方向?

最佳答案

这取决于您想要做什么,但是,如果您主要对两个书签之间的文本感兴趣,那么这是 XmlDocument/XPath 语义比 LINQ to XML 或强- Open XML SDK V2 的类型化对象模型。 XPath 的“following::*”轴的语义就是您想要的。以下示例使用 XmlDocument 和 XPath 打印书签开头和结尾之间的节点名称。

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<XmlNode>()
.TakeWhile(n =>
{
if (n.Name != "w:bookmarkEnd")
return true;
if (n.Attributes.Cast<XmlAttribute>().Any(a => a.Name == "w:id" && 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);
}
}
}
}

关于c# - 字 OpenXML 。在书签之间遍历 OpenXmlElements,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1718663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com