c# - 使用 XmlReader 类解析具有相同名称元素的 XML

标签 c# xml xmlreader

我正在重写一些使用 XmlDocument 来解析一些 XML 的代码。我想改用 XmlReader 来查看是否可以获得一些性能改进。 XML 的结构如下所示:

<items>
   <item id="1" desc="one">
      <itemBody date="2012-11-12" />
   </item>
   <item id="2" desc="two">
      <itemBody date="2012-11-13" />
   </item>
   <item id="3" desc="three">
      <itemBody date="2012-11-14" />
   </item>
   <item id="4" desc="four">
      <itemBody date="2012-11-15" />
   </item>
</items>

基本上,我需要遍历所有 <item>元素。就像我说的,旧代码是这样工作的:

XmlDocument document = new XmlDocument();

// load XML into XmlDocument
document.LoadXml(xml);

// use xpath to split into individual item
string xPath = @"items/item";
XmlNodeList nodeList = document.SelectNodes(xPath);

// loop through each item
for (int nodeIndex = 0; nodeIndex < nodeList.Count; nodeIndex++)
{
    // do something with the XmlNode
    nodeList[nodeIndex];
}

这很好用,但我认为使用 XmlReader 会更快。所以我写了这个:

XmlReader xmlReader = XmlReader.Create(new StringReader(xml));

while (xmlReader.Read())
{                       
   if (xmlReader.Name.Equals("item") && (xmlReader.NodeType == XmlNodeType.Element))
   {
      string id = xmlReader.GetAttribute("id");                 
      string desc = xmlReader.GetAttribute("desc");
      string elementXml = xmlReader.ReadOuterXml();
   }
}

但是,这段代码只读取第一个 <item>元素。 ReadOuterXml() 正在打破循环。有人知道如何解决这个问题吗?还是 XmlReader 无法进行这种类型的解析?我必须使用 .NET 版本 2 来执行此操作 :( 所以我不能使用 LINQ。

最佳答案

刚刚在 LinqPad 中测试了您的代码。效果很好。

 var xml = @"<items>
   <item id='1' desc='one' />
   <item id='2' desc='two' />
   <item id='3' desc='three' />
   <item id='4' desc='four' />
</items>";
XmlReader xmlReader = XmlReader.Create(new StringReader(xml));

while (xmlReader.Read())
{   
   if (xmlReader.Name.Equals("item") && (xmlReader.NodeType == XmlNodeType.Element))
   {
      string id = xmlReader.GetAttribute("id");              
      string desc = xmlReader.GetAttribute("desc");
      Console.WriteLine("{0} {1}", id, desc);
   }
}

输出:

1 one
2 two
3 three
4 four

也许您的 XML 有问题。

关于c# - 使用 XmlReader 类解析具有相同名称元素的 XML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13642633/

相关文章:

java - 如何在xml文件中获取java中children的属性?

web-services - 在 WebService 调用中序列化字符串时出错

c# - 如何删除由 c# 中的 xmlreader 打开的文件?

c# - 我可以使用 C# 预处理器跳过 Kinect v2.0 代码吗?

c# - 删除列表中的重复对象 (C#)

c# - 带有 List<> 项目的玻璃映射器 Editable() 不工作?

javascript - 带有ajax xml请求的 Node js脚本不起作用

xml - 在 C# 中从 XML 中删除所有属性的最简单方法是什么?

c# 简单的 xml 阅读器跳过所有其他元素

c# - DataBinding 相对于手动查询/添加到控件的优势