微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

阅读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;
}

原文地址:https://www.jb51.cc/xml/294037.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。