OpenXmlReader.Skip 应该如何工作?
How OpenXmlReader.Skip supposed to work?
Skips the child elements of the current node.
代码如下:
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>
?
<x:row>
是 one 元素的开始标签(标记开始),</x:row>
是结束标签(标记结束) =20=] 文件.
当您解析 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 ...
}
Skips the child elements of the current node.
代码如下:
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>
?
<x:row>
是 one 元素的开始标签(标记开始),</x:row>
是结束标签(标记结束) =20=] 文件.
当您解析 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 ...
}