Document.Body.Descendants<SdtBlock>() 不 return 所有 *sdt* 元素
Document.Body.Descendants<SdtBlock>() does not return all *sdt* elements
我正在尝试查找 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
}
问题是上面的代码没有 return 文件中的所有 SdtElements。在一份文档中有 19 个 SdtElements 但它 return 只有 7.
根据文档,Descendants 方法应该 return 来自所有级别的元素:
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、para 和 [=28] 下仅 sdt =]table cells 被 returned,但是当 sdt 在 para 下时table 单元格,它不是 returned。
我尝试了 http://www.ericwhite.com/blog/iterating-through-all-content-controls-in-an-open-xml-wordprocessingml-document/ 和其他类似文章中的代码。
如何从整个文档中获取所有 sdt 元素,而不考虑嵌套级别?
SdtElement
是其他 sdt 元素的基础 class:
- SdtBlock
- SdtCell
- SdtRow
- SdtRun
- SdtRunRuby
您正在尝试仅获取 SdtBlock
个元素:
List<SdtBlock> sdtList = mainPart.Document.Body.Descendants<SdtBlock>().ToList();
如果你想得到所有 SdtElements
你应该把它改成:
List<SdtElement> sdtList = mainPart.Document.Body.Descendants<SdtElement>().ToList();
请注意,SdtElements
也可能在 WordprocessingDocument
的其他部分,例如:
- MainDocumentPart
- 页眉
- 页脚
- 脚注
- 尾注
- 其他:(https://docs.microsoft.com/en-us/office/open-xml/structure-of-a-wordprocessingml-document)
在这种情况下,您应该遍历所有这些部分,例如:
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>());
}
我正在尝试查找 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
}
问题是上面的代码没有 return 文件中的所有 SdtElements。在一份文档中有 19 个 SdtElements 但它 return 只有 7.
根据文档,Descendants 方法应该 return 来自所有级别的元素:
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、para 和 [=28] 下仅 sdt =]table cells 被 returned,但是当 sdt 在 para 下时table 单元格,它不是 returned。
我尝试了 http://www.ericwhite.com/blog/iterating-through-all-content-controls-in-an-open-xml-wordprocessingml-document/ 和其他类似文章中的代码。
如何从整个文档中获取所有 sdt 元素,而不考虑嵌套级别?
SdtElement
是其他 sdt 元素的基础 class:
- SdtBlock
- SdtCell
- SdtRow
- SdtRun
- SdtRunRuby
您正在尝试仅获取 SdtBlock
个元素:
List<SdtBlock> sdtList = mainPart.Document.Body.Descendants<SdtBlock>().ToList();
如果你想得到所有 SdtElements
你应该把它改成:
List<SdtElement> sdtList = mainPart.Document.Body.Descendants<SdtElement>().ToList();
请注意,SdtElements
也可能在 WordprocessingDocument
的其他部分,例如:
- MainDocumentPart
- 页眉
- 页脚
- 脚注
- 尾注
- 其他:(https://docs.microsoft.com/en-us/office/open-xml/structure-of-a-wordprocessingml-document)
在这种情况下,您应该遍历所有这些部分,例如:
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>());
}