c# - 在 C# 中使用 XmlReader 读取 Xml

标签 c# xml xmlreader

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

<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 结合起来,方法是从 XmlReader 为您的每个流方式的“外部”元素:这使您可以在 LINQ to 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 的编辑,由 Jon 重新格式化 - 尽管不太清楚指的是哪个“读得太远”问题......

这应该可以简化嵌套并解决“读得太远”的问题。

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/

相关文章:

c# - 如何在 ASP.NET 中找到选定的 RadioButton 的值?

java - XML 配置大小为 0

ios - 从 NSDictionary 访问 xml 值

c# - 使用 JQuery Validate() 问题验证 .NET 2.0 表单

c# - 在 C# 中创建只读列表

c# - 在运行时,C# 如何委托(delegate)定义它的访问范围?

xml - 如何在 Xslt 中用另一个节点名替换节点名?

.net - 这个 XPath 查询有什么问题?

c# - XmlReader - 读取没有换行符的 xml 文件时出现问题