使用XMLReader解析大XML文件

问题描述 投票:0回答:1

我有一个很大的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>

我想检索PRODUCTDETAILS数据,其名称标签的值为 "car",并将其保存在一个新的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# xml xml-parsing xmlreader parsexml
1个回答
0
投票
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 发生。


0
投票

请尝试以下方法。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;

namespace ConsoleApplication1
{
    class Program
    {
        const string INPUT_FILENAME = @"c:\temp\test.xml";
        const string OUTPUT_FILENAME = @"c:\temp\test1.xml";
        static void Main(string[] args)
        {
            XmlReader reader = XmlReader.Create(INPUT_FILENAME);

            string header = "<?xml version=\"1.0\" encoding=\"utf-8\" ?><Cars></Cars>";
            XDocument doc = XDocument.Parse(header);
            XElement cars = doc.Root;

            while (!reader.EOF)
            {
                if (reader.Name != "PRODUCTDETAILS")
                {
                    reader.ReadToFollowing("PRODUCTDETAILS");
                }
                if (!reader.EOF)
                {
                    XElement product = (XElement)XElement.ReadFrom(reader);
                    if(product.Descendants("name").Any(x => ((string)x).Trim() == "Car"))
                    {
                        cars.Add(product);
                    }

                }
            }
            doc.Save(OUTPUT_FILENAME);
        }
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.