首页 > 解决方案 > 使用 XMLReader 解析大 XML 文件

问题描述

我有一个非常大的 xml 文件,格式如下

<ABC>
  <NAMEDETAILS></NAMEDETAILS>
  <PRODUCT>
    <PRODUCTDETAILS>
      <ProductName>
         <name>Car</Name>
         <name>lorry<name>
         <name>Car<name>
      </ProductName>
    </PRODUCTDETAILS>
    <PRODUCTDETAILS>
      <ProductName>
         <name>van</Name>
         <name>cycle</Name>
         <name>bus</Name>
      </ProductName>
    </PRODUCTDETAILS>
    <PRODUCTDETAILS>
      <ProductName>
         <name>car</Name>
         <name>cycle</Name>
         <name>bus</Name>
      </ProductName>
    </PRODUCTDETAILS>
  <PRODUCT>    
</ABC>

我想检索名称标签值为“car”的 PRODUCTDETAILS 数据并将其保存在新的 xml 文件中。我正在使用 XMLReader,但我一直在前进。有人可以帮助我。下面是c#代码

XMLReader xmlReader = XMLReader.Create(@"\\Drive\xmlfile.xml")
while (xmlReader.Read())
{
  If (xmlReader.NodeType == XMLNodeType.Element) && (xmlReader.Name == "PRODUCTDETAILS")
  {
    xmlReader.ReadtoDescendant("ProductName")
  }
}

标签: c#xmlxml-parsingxmlreaderparsexml

解决方案


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

namespace ConApp1
{
    class Program
    {
        static void Main()
        {
            using (var xmlWriter = XmlWriter.Create("result.xml"))
            using (var xmlReader = XmlReader.Create("test.xml"))
            {
                xmlWriter.WriteStartElement("PRODUCT");

                while (xmlReader.ReadToFollowing("PRODUCTDETAILS"))
                {
                    using (var nodeReader = xmlReader.ReadSubtree())
                    {
                        nodeReader.MoveToContent();

                        var elem = (XElement)XNode.ReadFrom(nodeReader);

                        var name = elem.Descendants("name").First().Value;

                        if (name.Equals("car", StringComparison.OrdinalIgnoreCase))
                        {
                            elem.WriteTo(xmlWriter);
                        }
                    }
                }
            }
        }
    }
}

既然你说文件很大,那么读写都应该使用流式工具来完成。XmlWriter用于书写。这保证了低内存消耗并且不会OutOfMemoryException发生。


推荐阅读