后代<t>在Word文档中获取零个元素

时间:2019-01-23 15:55:59

标签: c# openxml-sdk wordml

我在Word文档(Q How to update the body and a hyperlink in a Word doc)中更新超链接时遇到问题,并且无法放大Descendants<T>()调用。这是我的代码:

using DocumentFormat.OpenXml.Packaging;      //from NuGet ClosedXML
using DocumentFormat.OpenXml.Wordprocessing; //from NuGet ClosedXML

WordprocessingDocument doc = WordprocessingDocument.Open(...filename..., true);
MainDocumentPart mainPart = doc.MainDocumentPart;
IEnumerable<Hyperlink> hLinks = mainPart.Document.Body.Descendants<Hyperlink>();

因为mainPart获得了一个值,所以文档被打开确定。但是hLinks没有元素。如果我在Word中打开Word文档,则会显示超链接并且可以正常工作。

在立即窗口中,我看到以下值:

mainPart.Document.Body
-->
{DocumentFormat.OpenXml.Wordprocessing.Body}
    ChildElements: {DocumentFormat.OpenXml.OpenXmlChildElements}
    ExtendedAttributes: {DocumentFormat.OpenXml.EmptyEnumerable<DocumentFormat.OpenXml.OpenXmlAttribute>}
    FirstChild: {DocumentFormat.OpenXml.OpenXmlUnknownElement}
    HasAttributes: false
    HasChildren: true
    InnerText: "
       lots of data, e.g:
    ...<w:t>100</w:t>...

mainPart.Document.Body.Descendants<Text>().First()
-->
Exception: "Sequence contains no elements"

如果我什至找不到文本部分,应该如何查找和替换超链接?

2 个答案:

答案 0 :(得分:1)

如果您确定文件中有使用linq搜索的元素,并且没有返回任何内容或遇到异常,则通常表明存在命名空间问题。

如果您发布整个文件,我会更好地为您提供帮助,但是请检查您是否可以像这样对名称空间进行别名:

using W = DocumentFormat.OpenXml.Wordprocessing;

,然后在您的Descendants通话中,您需要执行以下操作:

var hLinks = mainPart.Document.Body.Descendants<W.Hyperlink>();

answer演示了另一个尝试的名称空间技巧。

答案 1 :(得分:0)

我的Word文档似乎有问题;它是用工具生成的。使用用Word创建的另一个Word文档进行测试可获得更好的结果。我正在努力...

使用常规的Word文档,查看

doc.MainDocumentPart.Document.Body.InnerXml

值开头:

<w:p w:rsidR=\"00455325\" w:rsidRDefault=\"00341915\" 
  xmlns:w=\"http://schemas.openxmlformats.org/wordprocessingml/2006/main\">
  <w:r>
    <w:t>Hello World!

但是带有我正在测试的doc一词,它来自我自己制作的工具:

<w:body xmlns:w=\"http://schemas.openxmlforma...

这解释了很多。 我将不得不修复我的工具:-)


更新:

解决方法是,这没有提供要插入Word Doc的数据的正确部分:

string strDocumentXml = newWordContent.DocumentElement.InnerXml;

但这是正确的数据:

string strDocumentXml = newWordContent.DocumentElement.FirstChild.OuterXml;

使用以下调试器进行检查:

doc.MainDocumentPart.Document.Body.InnerXml
如上所述,

确认。现在,“后代”调用将返回预期的数据,并且更新超链接有效。


旁注:

我显然已经修复了我的应用程序中的一个错误,但是除了更新超链接之外,该应用程序之前还可以正常运行,并且存在该错误:-)