【问题标题】:Using XMLReader to read large XML documents to parse the information into a class使用 XMLReader 读取大型 XML 文档,将信息解析成一个类
【发布时间】:2013-04-04 16:22:17
【问题描述】:

我一直在使用 XDocument 结合 LINQ to XML 来加载 xml 文件并填充我的类。

但是现在我的任务是确保我的程序可以处理所有大小的 XML 文档,这意味着我需要使用 XML Reader,而此时我无法控制 XMLReader 来填充我的类。

目前我有以下类要填充:

 public class DataRecord
  {
    private List<Fields> field = new List<Fields>();

    public string ID { get; set; }
    public string TotalLength { get; set; }

    public List<Fields> MyProperty
    {
      get { return field; }
      set { field = value; }
    }

  }

  internal class Fields
  {
    public string name { get; set; }
    public string startByte { get; set; }
    public string length { get; set; }
  }

}

我一直在尝试切换语句以强制 xmlreader 提供来自我的数据来填充类。例如:

using (XmlReader reader = XmlReader.Create(filename))
  {
    while (reader.Read())
    {
      switch (reader.NodeType)
      {
        case XmlNodeType.Element:
          switch (reader.Name)
          {
            case "DataRecord":
              var dataaa = new dataclass.DataRecord();
              break;
          }
         break;
      }
    }
  }

但正如我所说,这是一个例子,我已经搜索了很长时间来尝试找到答案,但我感到困惑。希望有人可以帮助我们解决我的问题。

【问题讨论】:

  • 您是要创建您的类的 一个 实例,还是很多实例?单个实例的每个元素是否会相当小? (您可以将 XmlReader 和 LINQ to XML 结合使用,但如果不知道这些问题的答案,将很难为您提供建议。)
  • 我几乎可以听到附近的Jon Skeet..
  • LINQ to XML 支持流式传输。见msdn.microsoft.com/en-us/library/…
  • @Jon Skeet 我要说很多实例,xml 中的每个数据记录都应该是一个新类。类本身的设置正是为了表示 xml 结构。

标签: c# xml linq xmlreader


【解决方案1】:

您可以使用XmlReader 在文档中移动,然后使用XElement. 加载每个元素

这是一个简短的例子:

using System;
using System.Xml;
using System.Xml.Linq;

class Test
{
    static void Main()
    {
        using (var reader = XmlReader.Create("test.xml"))
        {
            while (reader.ReadToFollowing("foo"))
            {
                XElement element = XElement.Load(reader.ReadSubtree());
                Console.WriteLine("Title: {0}", element.Attribute("title").Value);
            }
        }
    }
}

使用示例 XML:

<data>
  <foo title="x" /><foo title="y">asd</foo> <foo title="z" />
</data>

(有点不一致只是为了表明它可以处理有内容的元素,它们之间没有空格的元素,以及它们之间有空格的元素。)

那么显然在循环中你可以用XElement 做任何你需要做的事情——如果你已经有办法从XElement 创建你的类的实例,你可以调用它,使用对象,然后你就走了。

【讨论】:

  • 不知道XElement支持Load!非常酷,感谢您的提示!
  • @TomW:我很确定这里还有另一种使用XmlReader 来填充XElement 的方法——但如果你确实使用Load,你需要以XElement.Load 调用ReadSubtree 将检查它是否已到达XmlReader 的末尾。
猜你喜欢
  • 2019-07-14
  • 2020-08-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多