阅读Xml与XmlReader在C#

我试图尽快阅读下面的Xml文档,并让额外的类管理每个子块的读取。
<ApplicationPool>
    <Accounts>
        <Account>
            <NameOfKin></NameOfKin>
            <StatementsAvailable>
                <Statement></Statement>
            </StatementsAvailable>
        </Account>
    </Accounts>
</ApplicationPool>

但是,我试图使用XmlReader对象来读取每个帐户,然后读取“StatementsAvailable”。你建议使用XmlReader.Read并检查每个元素并处理吗?

我想到分离我的类正确处理每个节点。因此,一个AccountBase类接受一个XmlReader实例,读取NameOfKin和其他几个关于帐户的属性。然后,我想通过语句交互,让另一个类填充自己的声明(随后添加到IList)。

到目前为止,我有“每类”部分通过做XmlReader.ReadElementString()完成,但我不能锻炼如何告诉指针移动到StatementsAvailable元素,让我迭代通过他们,让另一个类读取每个proeprties 。

听起来很容易!

我的XmlReader的经验是,它很容易意外阅读太多。我知道你说你想尽快阅读它,但你有没有尝试过使用DOM模型?我发现LINQ到XML使XML工作更容易。

如果您的文档特别巨大,您可以将XmlReader和LINQ与XML结合,以流式方式为每个“外部”元素从XmlReader创建一个XElement:这允许您以LINQ到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用户数据(这是巨大的)转换为另一种格式 – 它工作得很好。

编辑从雷达,重新格式化的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;
}

相关文章

php输出xml格式字符串
J2ME Mobile 3D入门教程系列文章之一
XML轻松学习手册
XML入门的常见问题(一)
XML入门的常见问题(三)
XML轻松学习手册(2)XML概念