我正在尝试查找 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
}
Run Code Online (Sandbox Code Playgroud)
问题是上面的代码没有返回文件中的所有 SdtElements。在一份文档中有 19 个 SdtElement,但它只返回 7 个。
根据文档,后代方法应返回所有级别的元素:
Elements只查找那些直接后代元素,即直接子元素。vs Descendants查找任何级别的孩子,即孩子、孙子等...
观察到的一件事是仅返回body、para和表格单元格下的sdt ,但是当sdt位于表格单元格内的para下时,它不会返回。
如何从整个文档中获取所有 sdt 元素,无论嵌套级别如何?
SdtElement是其他 SDT 元素的基类:
(来源: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();
Run Code Online (Sandbox Code Playgroud)
如果你想获得全部,SdtElements你应该将其更改为:
List<SdtElement> sdtList = mainPart.Document.Body.Descendants<SdtElement>().ToList();
Run Code Online (Sandbox Code Playgroud)
请注意,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>());
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1394 次 |
| 最近记录: |