字 OpenXML 。在书签之间遍历 OpenXmlElements

2024-01-07

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

如果您绘制文档的树结构,我想检查开始书签和结束书签之间的所有节点。我认为遍历从节点 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);
            }
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

字 OpenXML 。在书签之间遍历 OpenXmlElements 的相关文章

随机推荐

  • 带参数的 get_absolute_url

    My urls py urlpatterns url r profile profile profile name profile My model class Reg models Model name models CharField
  • Django 管理模型ArrayField 更改分隔符

    我的模型看起来像这样 from django contrib postgres fields import ArrayField class Trigger models Model solutions ArrayField models
  • 使用 OpenCVsolvePnP 在 OpenGL 中实现增强现实

    我正在尝试使用 Android 构建增强现实应用程序BoofCV http boofcv org index php title Main Page Java 的 OpenCV 替代品 和 OpenGL ES 2 0 我有一个标记 我可以使
  • 如何配置 log4j2 Web 应用程序

    我对 Web 应用程序不太陌生 最近我需要使用日志记录机制 为此我选择了 Log4J2 我浏览了那里的指南 并下载了所需的库 到目前为止我就是这么做的 1 Added following jars to web inf lib log4j
  • 在 Go 模板范围循环中,循环外部声明的变量是否会在每次迭代时重置?

    我正在尝试使用在 Go 模板范围循环之外声明的变量来查看上一篇文章是否与当前文章发生在同一天 这是一个简化的示例 Where Posts是一个 post 结构数组 每个结构都有一个 Content and a Date prevDate r
  • 在 Alpine docker 中安装软件包

    如何编写 Dockerfile 命令来在 alpine docker 镜像中安装以下内容 软件属性 通用 openjdk 8 jdk python3 nltk Flask 相当于apt or apt get位于阿尔卑斯山的是apk 例如 典
  • Android 的图形 API [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种在 Android 应用程序中动态显示图形的好方法 有一个工具吗 做图表有很多意见 如果您想
  • Django、REST:序列化文本或图像文件以通过 HTTP 以 JSON 形式发布

    Running Windows 7 Python 3 3 姜戈1 6 背景 我使用 REST 框架在 Django 中创建了一个应用程序 它接受 HTTP POST 请求以及正文中对象的 JSON 描述 并根据这些 POST 请求在 SQL
  • 在 MATLAB 中将类数组的元素分配给各个变量时出现问题

    这有点重复这个问题 https stackoverflow com questions 2893356 matlab easiest way to assign elements of a vector to individual vari
  • 使用 ng-click 传递对 DOM 对象的引用

    我有多个元素在 ng click 上具有相同的回调
  • TestFlight 崩溃日志未显示在 Xcode 中?

    好的 我使用的是最新版本的Xcode macOs 一切都更新了 我刚刚将新版本上传到 TestFlight 突然在 Organizer 中没有显示任何崩溃报告 我知道我们发生了崩溃 因为我的测试人员向我展示了他的手机 我让他进入隐私设置并打
  • SSO 华夫饼询问用户名和密码

    我正在尝试运行华夫饼 华夫饼过滤器演示 的演示 下载自http repo1 maven org maven2 com github dblock waffle waffle filter demo 1 6 waffle filter dem
  • Hammer.js:如何处理/设置相同元素上的点击和双击

    我正在使用 jquery hammer js 它工作得很好 我能够将函数绑定到双击事件 效果很好 我想要的是绑定两种不同的行为 一种用于 点击 一种用于 双击 我使用下面的代码来绑定我的函数 当我这样做时 我只得到 点击 双击 似乎没有被触
  • 无法使用 Vite 使用 Vue 3 加载模板组件库

    我创建了一个示例项目来重现此问题 https github com splanard vue3 vite web components https github com splanard vue3 vite web components 我
  • 如何创建装饰器以延迟初始化属性

    我想创建一个像属性一样工作的装饰器 只是它仅调用装饰函数一次 并且在后续调用中始终返回第一次调用的结果 一个例子 def SomeClass object LazilyInitializedProperty def foo self pri
  • Java 神秘的 EOF 异常与 readObject

    下面的代码产生一个EOFException 这是为什么 public static Info readInfoDataFromFile Context context Info InfoData null FileInputStream f
  • 使用 Javascript 以编程方式将 Google Chrome 置于全屏模式?

    我最近在使用 YouTube 时 点击了 YouTube 视频中的全屏按钮 屏幕顶部出现一条消息 说我已进入全屏模式 此消息是您在键盘上按 f 11 时收到的本机消息 我还在某处读过一些东西 我现在找不到 说现在可以用 Javascript
  • 序列化对象消失(BinaryFormatter)

    背景 我有一个对象需要序列化才能传输到高性能计算集群以供以后使用 以前 我为我的对象使用了开箱即用的二进制格式化程序 它代表了统计形状模型 并且一切都很顺利 我的对象变得更加复杂 我决定通过实现 ISerialized 来自定义序列化过程
  • 将 n 写成 2 的幂和的方法数

    是否有任何算法可以找出有多少种方法可以写入一个数字 例如 n 其幂总和为 2 例如 对于 4 有四种方法 4 4 4 2 2 4 1 1 1 1 4 2 1 1 thanks 假设g m 是把m写成2的幂和的方式的数量 我们用f m k 来
  • 字 OpenXML 。在书签之间遍历 OpenXmlElements

    我需要遍历书签开始和书签结束标记之间的节点 问题似乎分解为树遍历 但我无法确定正确的算法 书签开始和结束元素是非复合节点 没有子节点 并且可以出现在树中的任意深度 书签开始也不保证处于相同的深度 如果您绘制文档的树结构 我想检查开始书签和结