我正在尝试尽可能快地阅读以下 Xml 文档,并让其他类管理每个子块的阅读。

<ApplicationPool>
    <Accounts>
        <Account>
            <NameOfKin></NameOfKin>
            <StatementsAvailable>
                <Statement></Statement>
            </StatementsAvailable>
        </Account>
    </Accounts>
</ApplicationPool>

但是,我正在尝试使用 XmlReader 对象来读取每个帐户以及随后的“StatementsAvailable”。您是否建议使用 XmlReader.Read 并检查每个元素并处理它?

我想过分开我的类来正确处理每个节点。所以有一个 AccountBase 类,它接受一个 XmlReader 实例,该实例读取 NameOfKin 和有关该帐户的其他几个属性。然后我想通过 Statements 进行交互,让另一个类自己填写关于 Statement 的内容(然后将其添加到 IList)。

到目前为止,我通过执行 XmlReader.ReadElementString() 完成了“每类”部分,但我无法锻炼如何告诉指针移动到 StatementsAvailable 元素,让我遍历它们并让另一个类读取每个属性.

听起来很简单!

最佳答案

我对XmlReader的经验是,很容易不小心读多了。我知道你说过你想尽快阅读它,但你是否尝试过使用 DOM 模型?我发现 LINQ to XML 使 XML 的工作变得更加容易。

如果您的文档特别大,您可以将 XmlReader 和 LINQ to XML 结合起来,方法是从 XElement 以流式方式为每个“外部”元素创建一个 XmlReader:这让您可以进行大部分 XML 转换在任何时候仍然只需要内存中的一小部分文档。这是一些示例代码(从 this blog post 稍微改编):

static IEnumerable<XElement> SimpleStreamAxis(string inputUrl,
                                              string elementName)
{
  using (XmlReader reader = XmlReader.Create(inputUrl))
  {
    reader.MoveToContent();
    while (reader.Read())
    {
      if (reader.NodeType == XmlNodeType.Element)
      {
        if (reader.Name == elementName)
        {
          XElement el = XNode.ReadFrom(reader) as XElement;
          if (el != null)
          {
            yield return el;
          }
        }
      }
    }
  }
}

我以前用它来将 StackOverflow 用户数据(这是巨大的)转换为另一种格式 - 它工作得很好。

来自radarbob的编辑,由乔恩重新格式化 - 虽然不太清楚哪个“读得太远”问题正在被提及......

这应该会简化嵌套并解决“读得太远”的问题。
using (XmlReader reader = XmlReader.Create(inputUrl))
{
    reader.ReadStartElement("theRootElement");

    while (reader.Name == "TheNodeIWant")
    {
        XElement el = (XElement) XNode.ReadFrom(reader);
    }

    reader.ReadEndElement();
}

这解决了“读得太远”的问题,因为它实现了经典的 while 循环模式:
initial read;
(while "we're not at the end") {
    do stuff;
    read;
}

关于c# - 在 C# 中使用 XmlReader 读取 Xml,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2441673/

10-14 08:53