关于使用 XmlReader 读取子节点的正确方法的困惑
Confusion about the proper way to read child nodes with XmlReader
假设我有以下 Xml:
<Sections>
<Section>
<Item>
<Field> myfield </Field>
<Field> myfield </Field>
</Item>
<Item>
<Field> myfield </Field>
<Field> myfield </Field>
</Item>
</Section>
<Section>
<Item>
<Field> myfield </Field>
<Field> myfield </Field>
</Item>
</Section>
</Sections>
现在我想要的是遍历各个部分,并分别处理每个项目,所以我想做如下事情:
reader.ReadToDescendant("Section")
do
{
Console.WriteLine("Section");
reader.ReadToDescendant("Item");
do
{
var element = (XElement)XNode.ReadFrom(reader);
foreach (XElement el in element.Elements())
{
Console.WriteLine(el.Value);
}
}while(reader.ReadToNextSibling("Item"));
}while (reader.ReadToNextSibling("Section"))
我的问题是。如果我对 Item 节点重复相同的 do-while 循环,reader 是在找到结束部分标记时停止还是会在所有 xml 中搜索?我应该在内部循环之前使用 reader.ReadSubtree() 吗?
请注意,我不是在寻找 "Use XDocument" 这样的标准答案。我知道dom比较好用,但是不适合我的情况
使用ReadSubtree
创建内部reader以与当前节点一起工作。如果没有这个,reader 将不会停止并继续搜索,直到文档结束。
reader.ReadToDescendant("Section");
do
{
Console.WriteLine("Section");
using (var innerReader = reader.ReadSubtree())
{
while (innerReader.ReadToFollowing("Field"))
{
Console.WriteLine("field");
}
}
} while (reader.ReadToNextSibling("Section"));
假设我有以下 Xml:
<Sections>
<Section>
<Item>
<Field> myfield </Field>
<Field> myfield </Field>
</Item>
<Item>
<Field> myfield </Field>
<Field> myfield </Field>
</Item>
</Section>
<Section>
<Item>
<Field> myfield </Field>
<Field> myfield </Field>
</Item>
</Section>
</Sections>
现在我想要的是遍历各个部分,并分别处理每个项目,所以我想做如下事情:
reader.ReadToDescendant("Section")
do
{
Console.WriteLine("Section");
reader.ReadToDescendant("Item");
do
{
var element = (XElement)XNode.ReadFrom(reader);
foreach (XElement el in element.Elements())
{
Console.WriteLine(el.Value);
}
}while(reader.ReadToNextSibling("Item"));
}while (reader.ReadToNextSibling("Section"))
我的问题是。如果我对 Item 节点重复相同的 do-while 循环,reader 是在找到结束部分标记时停止还是会在所有 xml 中搜索?我应该在内部循环之前使用 reader.ReadSubtree() 吗?
请注意,我不是在寻找 "Use XDocument" 这样的标准答案。我知道dom比较好用,但是不适合我的情况
使用ReadSubtree
创建内部reader以与当前节点一起工作。如果没有这个,reader 将不会停止并继续搜索,直到文档结束。
reader.ReadToDescendant("Section");
do
{
Console.WriteLine("Section");
using (var innerReader = reader.ReadSubtree())
{
while (innerReader.ReadToFollowing("Field"))
{
Console.WriteLine("field");
}
}
} while (reader.ReadToNextSibling("Section"));