【问题标题】:Confusion about the proper way to read child nodes with XmlReader对使用 XmlReader 读取子节点的正确方法感到困惑
【发布时间】:2018-04-06 14:15:04
【问题描述】:

假设我有以下 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 循环,阅读器会在找到结束的 Section 标记时停止还是在所有 xml 中搜索?我应该在内部循环之前使用 reader.ReadSubtree() 吗?

请注意,我不是在寻找像“使用 XDocument”这样的标准答案。我知道 dom 比较好用,但是不适合我的情况

【问题讨论】:

  • 听起来您可以轻松测试自己
  • 坦率地说,我在这里能给出的唯一好答案是:“小心”。我一直都在使用序列化 API,而 XmlReader遥遥无期最尴尬的一个 - 找出哪些操作将读者引导到通常的位置一个案件​​审判和Exception
  • @MarcGravell 这就是我问的原因。老实说,我发现 msdn 上有关 XmlReader 方法的文档非常令人沮丧,而且我很难弄清楚哪种方法更合适以及何时更合适。我正在寻找比我更有经验的人来澄清一些事情
  • @DanieleSartori 好吧,基于多年使用这些 API 的经验,我可以准确地澄清两件事:1)你没有错 - 文档不清楚,2)API 使用起来很尴尬

标签: c# xml xmlreader


【解决方案1】:

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

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

【讨论】:

  • 检查我的编辑。我添加了内部循环的代码。从我的测试来看,它似乎给出了相同的输出。在哪种情况下使用 ReadSubtree 更好?
  • @DanieleSartori - XElement 将读取内存中的所有 Item 内容。如果它很大,那么内存可能不够用。然后你需要去内部的xmlreader。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多