关于使用 XmlReader 读取子节点的正确方法的困惑

Dan*_*ori 4 c# xml 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>
Run Code Online (Sandbox Code Playgroud)

现在我想要的是循环遍历各个部分,并分别处理每个项目,所以我正在考虑执行如下操作:

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"))
Run Code Online (Sandbox Code Playgroud)

我的问题是。如果我对 Item 节点重复相同的 do-while 循环,那么读取器在找到结束部分标记时是否会停止,或者它将在所有 xml 中进行搜索?我应该在内部循环之前使用 reader.ReadSubtree() 吗?

请注意,我并不是在寻找“使用 XDocument”之类的标准答案。我知道 dom 更容易使用,但它们不适合我的情况

Ale*_*rov 8

用于ReadSubtree创建内部读取器以与当前节点一起使用。如果没有这个,读者将不会停止并继续搜索,直到文档结束。

reader.ReadToDescendant("Section");
do
{
    Console.WriteLine("Section");
    using (var innerReader = reader.ReadSubtree())
    {
        while (innerReader.ReadToFollowing("Field"))
        {
            Console.WriteLine("field");
        }
    }
} while (reader.ReadToNextSibling("Section"));
Run Code Online (Sandbox Code Playgroud)