【问题标题】:OpenXML SDK 2.0 Enumerate XML Parts and ElementsOpenXML SDK 2.0 枚举 XML 部件和元素
【发布时间】:2011-01-01 02:00:49
【问题描述】:

我正在尝试使用 OpenXML SDL 2.0 在 Word 文档中构建特定元素的列表。我将打开一个模板并扫描 Word 模板中的所有“w:sdt”元素,这些元素将用作可用文档部分的列表。我将向用户显示此列表,以便他们可以选择所需的部分/元素,以从模板文档构建文档的新版本/副本。

所以我的列表需要获取顺序元素编号(这由 DocumentBuilder 类使用)以及“w:alias”“val”或者可能会使用的“w:tag”“val”向用户显示选择选项。

一旦用户查看了可用的模板 XML 部分/元素并做出选择,我将使用 DocumentBuilder 按序号将标识的部分添加到新文档中。

我已成功使用 DocumentBuilder 按序号显式识别文档元素以构建新文档。这很好用。

我知道我需要使用递归来遍历模板文档并将合格的元素添加到列表中。我只是对 C# 或 OpenXML SDK 还不够精通,无法确定通过针对所需 XML 部分/元素的模板文档进行递归的最优雅方式。

谁能指出一个适用的示例,用于枚举 OpenXML 文档中的部分/元素列表?

【问题讨论】:

  • ...所以我正在研究,我想我应该研究一下 Brian Jones 和 Zeyad 的博客文章“使用 Open XML SDK 解析和读取大型 Excel 文件”中介绍的类似 SAX 的方法.这允许使用 OpenXMLReader 遍历 XML 部件或元素。我还不清楚具体如何做到这一点,但它似乎是要走的路。

标签: xml-serialization openxml-sdk


【解决方案1】:

除非有性能方面的原因,否则您是否可以不使用 OpenXmlSdk 打开文档并执行 LINQ 查询来定位您的每个 SDT 元素?

类似的东西:

using(WordProcessingDocument doc = WordProcessingDocument.Open(byte[], false);){

     IEnumerable<SdtContent> sdtElements = doc.MainDocumentPart.Body.Descendants<SdtContent>();
     foreach(SdtContent el in sdtElements){
        // Collect content tag name/alias
        // Collect your sequential element number?
     }
}

我之前使用过这种方法并过滤掉外部元素以收集 SdtContent 元素列表。虽然我不确定您所说的顺序元素编号是什么意思?

【讨论】:

  • 经过进一步研究,我已经能够使用 Builder 类来抓取段落和 SDT 块等元素。使用 LINQ 和 OpenXML SDK 2.0,我可以在 IEnurmerable 对象中收集这些元素。
  • @damoe - Damoe,您能否帮我解决以下问题:stackoverflow.com/questions/15791732/…
猜你喜欢
  • 2014-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-23
  • 2021-12-19
  • 1970-01-01
  • 2010-10-17
  • 1970-01-01
相关资源
最近更新 更多