我正在尝试在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个SdtElement,但仅返回7。
根据文档,Descendants方法应返回所有级别的元素:
元素仅查找那些直接后代的元素,即 直系孩子。 vs 后代可以找到任何级别的孩子,即 孩子,孙子等等...
仅在 body , para 和表格单元格下返回 sdt sdt 位于表单元格中的 para 下,不会返回。
我尝试了http://www.ericwhite.com/blog/iterating-through-all-content-controls-in-an-open-xml-wordprocessingml-document/和其他类似文章中的代码。
无论嵌套级别如何,如何从整个文档中获取所有sdt元素?
答案 0 :(得分:2)
SdtElement
是其他sdt元素的基类:
您正尝试仅获取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>());
}