尝试在Word文档中选择所有XMLNode

时间:2014-07-28 22:20:50

标签: ms-word ms-office

我正在为Microsoft Word(C#)创建一个插件,我希望获得存储文档的所有XMLNode(因为它是一个DOCX文件)。

Word的API有一个带有xpath的SelectNodes函数,但是当我尝试不同的参数时我得到null。我正在尝试选择所有节点(现在),因此我不认为它是命名空间问题(但我可能是错的)。这是相关的代码:

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 个答案:

答案 0 :(得分:1)

这肯定会令人困惑,但是......

当您使用Microsoft.Office.Interop.Word时,您实际上正在使用自动化来访问Word的对象模型。但是对象模型并不真正了解.docx文件中的XML(如下所述,有一些例外)。如果要检查实际位于磁盘上的.docx中的XML,您确实需要使用Ofice Open XML SDK,或者可能使用Packaging接口。

那么为什么Document对象的“SelectNodes”成员呢?好吧,它可以让你选择“自定义XML”节点。但是Word中不再支持这些 - 由于几年前的诉讼,微软取消了对美国版Word 2007的支持,然后在某些时候取消了所有后续版本的Word。实际上,您仍然可以通过名为XML Structure窗格的东西插入此类节点(例如,在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将是相同的。