OpenXmlReader.Skip应该如何工作

本文关键字:工作 何工作 Skip OpenXmlReader | 更新日期: 2023-09-27 18:33:27

来自文档:

跳过当前节点的子元素

这是代码:

var reader = DocumentFormat.OpenXml.OpenXmlReader.Create(worksheetPart);
// Header
while (reader.Read())
{
    if (reader.ElementType == typeof (Row)) // reader is at row r="1"
    {
        headers = GetHeaders((Row)reader.LoadCurrentElement(), _doc.WorkbookPart);
        reader.ReadNextSibling(); // reader is at row r="2"
        break;
    }
}
//...
reader.Skip(); // reader is at row r="3"

工作表 xml(剪切(:

<x:sheetData xmlns:x="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
  <x:row r="1" spans="1:1">
      <x:c r="A1" s="1" t="s">
        <x:v>36</x:v>
      </x:c>
  </x:row>
  <x:row r="2" spans="1:1"> <!-- before calling Skip reader is here -->
      <x:c r="A2" s="1" t="s">
        <x:v>38</x:v>
      </x:c>
  </x:row> <!-- I expect reader to be here after calling Skip because closing tag != child element -->
  <x:row r="3" spans="1:1"> <!-- after calling Skip reader goes here -->
      <x:c r="A3" s="1" t="s">
        <x:v>38</x:v>
      </x:c>
  </x:row>
</x:sheetData>

为什么Skip跳过也</x:row>

OpenXmlReader.Skip应该如何工作

<x:row>是 XML 文件中一个元素的开始标记(标记开始(,</x:row>是结束标记(标记结束(。

解析 XML 文档后,它表示为节点对象的树,每个节点都有父节点、同级和子节点。

因此,不要将内存中作为树的表示与作为文件的表示混淆。

这是一个小的扩展方法,可以跳到类型 T 元素的下一个标记。标签可以是开始标签或结束标签。(注意:如果没有该类型的标签,那么它将跳到文档的末尾(

public static void SkipTo<T>(this OpenXmlReader reader) where T : OpenXmlElement
{
    while (reader.Read() && reader.ElementType != typeof(T))
        ;
}

所以通常在阅读时你知道你当前元素的类型:

if (reader.ElementType == typeof(PivotFields) && !reader.IsEndElement)
{
    // some code ...
    reader.SkipTo<PivotFields>(); // reader is now at </x:pivotFields>
    // some code ...
}