尝试选择 Word 文档中的所有 XMLNode
Posted
技术标签:
【中文标题】尝试选择 Word 文档中的所有 XMLNode【英文标题】:Trying to Select All XMLNodes in Word Document 【发布时间】:2014-07-28 22:20:49 【问题描述】:我正在为 Microsoft Word (C#) 制作一个插件,我想获取存储文档的所有 XMLNodes(因为它是一个 DOCX 文件)。
Word 的 API 有一个 SelectNodes 函数,它采用 xpath,但是当我尝试不同的参数时,我得到了 null。我正在尝试选择 all 节点(目前),因此我认为这不是命名空间问题(但我可能是错的)。以下是相关代码:
using Word = Microsoft.Office.Interop.Word;
Word.XMLNodes docNodes = Doc.SelectNodes("//*");
System.Diagnostics.Debug.WriteLine("We have node count: " + docNodes.Count.ToString());
for (int i = 0; i < docNodes.Count; i++)
Word.XMLNode node = docNodes[i];
System.Diagnostics.Debug.WriteLine(node.get_XML());
当我尝试使用 docNodes 时失败,因为对 Doc.SelectNodes 的调用返回 null。我在一个 Word 文档上运行它——实际上是通过在 Word 中单击“新文档”然后在几个段落中输入一些文本来创建的。
我在此处或 MSDN 上找不到关于如何让此函数产生结果的好的文档或示例。
【问题讨论】:
【参考方案1】:这肯定会令人困惑,但是...
当您使用 Microsoft.Office.Interop.Word 时,您实际上是在使用自动化来访问 Word 的对象模型。但是对象模型并不真正了解 .docx 文件中的 XML(有一些例外情况,如下所述)。如果您想检查实际在磁盘上的 .docx 中的 XML,您确实需要使用 Office Open XML SDK,或者可能是 Packaging 接口。
那么为什么 Document 对象有一个“SelectNodes”成员呢?好吧,它可以让您选择“自定义 XML”节点。但这些不再在 Word 中得到支持——由于几年前的诉讼,微软从美国版 Word 2007 中删除了支持,然后在某个时候从所有更高版本的 Word 中删除了支持。实际上,您仍然可以通过称为 XML 结构窗格的东西插入此类节点(例如 Word 2010)。但是如果你保存文档并重新打开,这种类型的自定义 XML 就会消失。
尽管名称如此,但这种类型的东西与自定义 XML 部件中的 XML 不同。自定义 XML 部件是开发人员设计的数据区域,用于在 .docx 中存储“您想要的任何 XML”。例如,SharePoint 使用自定义 XML 部件作为存储在“SharePoint 列”中定义的属性的机制 - Word 可以在“内容控件”中显示此属性数据。可以在自定义 XML 部件中检索和操作 XML 节点。
最后,如果您需要检查或操作 Word 实际用于表示文档的 XML通过对象模型,您可以使用 XML 或 WordOpenXML 属性以有限的方式执行此操作范围、选择或文档对象。 (XML 是 Word 2003 XML 格式的表示。WordOpenXML 是 Word OOXML Flat OPC 格式的表示)。但请记住,您只能真正看到 Word 需要用来表示您提取的文档的特定部分的 XML - 您永远无法通过这种方式看到文档的完整 XML,而且您不能真正假设Word 将保存在磁盘上的 XML 将是相同的。
【讨论】:
以上是关于尝试选择 Word 文档中的所有 XMLNode的主要内容,如果未能解决你的问题,请参考以下文章