Descendants<T> 在 Word 文档中获取零个元素
Descendants<T> gets zero elements in Word doc
我在更新 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 文档,会出现一个超链接并且可以正常工作。
在即时 Window 中,我看到以下值:
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"
如果我连文本部分都找不到,我该如何查找和替换超链接?
如果您确定文件中有您正在使用 linq 搜索的元素,但没有返回任何内容或出现异常,这通常表明存在命名空间问题。
如果你 post 你的整个文件,我可以更好地帮助你,但请检查你是否可以像这样为你的命名空间起别名:
using W = DocumentFormat.OpenXml.Wordprocessing;
然后在你的 Descendants
电话中你做这样的事情:
var hLinks = mainPart.Document.Body.Descendants<W.Hyperlink>();
这个 answer 演示了另一个可以尝试的命名空间技巧。
我的 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 文档的正确数据部分:
string strDocumentXml = newWordContent.DocumentElement.InnerXml;
但这是正确的数据:
string strDocumentXml = newWordContent.DocumentElement.FirstChild.OuterXml;
使用调试器检查:
doc.MainDocumentPart.Document.Body.InnerXml
如上所说,确认。后代现在调用 returns 预期数据,并且更新超链接有效。
旁注:
我清楚地修复了我的应用程序中的一个错误,但是,除了更新超链接之外,该应用程序之前运行正常,但有那个错误:-)
我在更新 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 文档,会出现一个超链接并且可以正常工作。
在即时 Window 中,我看到以下值:
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"
如果我连文本部分都找不到,我该如何查找和替换超链接?
如果您确定文件中有您正在使用 linq 搜索的元素,但没有返回任何内容或出现异常,这通常表明存在命名空间问题。
如果你 post 你的整个文件,我可以更好地帮助你,但请检查你是否可以像这样为你的命名空间起别名:
using W = DocumentFormat.OpenXml.Wordprocessing;
然后在你的 Descendants
电话中你做这样的事情:
var hLinks = mainPart.Document.Body.Descendants<W.Hyperlink>();
这个 answer 演示了另一个可以尝试的命名空间技巧。
我的 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 文档的正确数据部分:
string strDocumentXml = newWordContent.DocumentElement.InnerXml;
但这是正确的数据:
string strDocumentXml = newWordContent.DocumentElement.FirstChild.OuterXml;
使用调试器检查:
doc.MainDocumentPart.Document.Body.InnerXml
如上所说,确认。后代现在调用 returns 预期数据,并且更新超链接有效。
旁注:
我清楚地修复了我的应用程序中的一个错误,但是,除了更新超链接之外,该应用程序之前运行正常,但有那个错误:-)