c# - Document.Body.Descendants<SdtBlock>() 不返回所有 *sdt* 元素

标签 c# openxml wordml

我正在尝试查找 Word 文档中的所有 SdtElement。我使用了以下代码:

using (var wordDoc = WordprocessingDocument.Open(FilePath, true))
{
    var docSdts = wordDoc.MainDocumentPart.Document.Descendants<SdtElement>();
    // MainDocumentPart.Document.Body.Descendants<SdtElement>(); also used but same result

    MainDocumentPart mainPart = wordDoc.MainDocumentPart;
    List<SdtBlock> sdtList = mainPart.Document.Body.Descendants<SdtBlock>().ToList();

    // process all sdt
}

问题是上面的代码没有从文件中返回所有的 SdtElements。在一个文档中有 19 个 SdtElements 但它只返回 7 个。

根据文档,Descendants 方法应该返回所有级别的元素:

Elements finds only those elements that are direct descendents, i.e. immediate children. vs Descendants finds children at any level, i.e. children, grand-children, etc...

观察到的一件事是 body 下的 sdtparatable cells 被返回,但是当sdttable cell 内的 para 下,它不会被返回。

我尝试了 http://www.ericwhite.com/blog/iterating-through-all-content-controls-in-an-open-xml-wordprocessingml-document/ 中的代码和其他类似文章。

无论嵌套级别如何,如何从整个文档中获取所有 sdt 元素?

最佳答案

SdtElement 是其他 sdt 元素的基类:

  • 数据 block
  • 独立细胞
  • 数据行
  • SdtRun
  • SdtRunRuby

(来源:https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.wordprocessing.sdtelement?view=openxml-2.8.1)

您正在尝试仅获取 SdtBlock 元素:

List<SdtBlock> sdtList = mainPart.Document.Body.Descendants<SdtBlock>().ToList();

如果你想得到所有的SdtElements你应该把它改成:

List<SdtElement> sdtList = mainPart.Document.Body.Descendants<SdtElement>().ToList();

请注意,SdtElements 也可能位于 WordprocessingDocument 的其他部分,例如:

在这种情况下,您应该遍历所有这些部分,例如:

List<SdtElement> sdtList = mainPart.Document.Body.Descendants<SdtElement>().ToList();
foreach(var part in mainPart.Document.HeaderParts)
{
   sdtList.AddRange(part.Header.Descedants<SdtElement>());
}
foreach(var part in mainPart.Document.FooterParts)
{
   sdtList.AddRange(part.Footer.Descedants<SdtElement>());
}

关于c# - Document.Body.Descendants<SdtBlock>() 不返回所有 *sdt* 元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59894814/

相关文章:

html - css 打印模式 : display header and footer only on first page of a generated word doc

xml - 默认 WordML 单位度量?像素或点或英寸

c# - 配置 intellitest 以仅使用 Visual Studio 2015 RC 中的一个测试项目

c# - 如何在 xamarin ios 中设置 imageview 控件的高度宽度

c# - 字段的实际性能与属性

c# - 向 Word 文档中的现有表格添加一行(打开 XML)

c# - RegistryKey 值更改时收到通知

c# - 在打开的 xml 中查找特定表(在书签之后)

c# - 如何在 C# 中使用 Open XML 从 Word 文档中查找准确的单词?

xslt - 带有 float div 元素的格式化语言