1

我在更新 Word 文档中的超链接时遇到了问题(Q如何更新 Word 文档中的正文和超链接),并且正在放大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"

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

4

2 回答 2

1

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

如果您发布整个文件,我可以更好地帮助您,但请检查您是否可以像这样为您的命名空间设置别名:

using W = DocumentFormat.OpenXml.Wordprocessing;

然后在你的Descendants电话中你做这样的事情:

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

这个答案也演示了另一个可以尝试的命名空间技巧。

于 2019-01-24T17:03:08.067 回答
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

如上所述,确认它。后代调用现在返回预期的数据,并且更新超链接工作。


边注:

我清楚地修复了我的应用程序中的一个错误,但是,除了更新超链接之外,该应用程序之前运行得非常好,有那个错误:-)

于 2019-01-25T11:09:26.447 回答