Разобрать файл Big XML с помощью XMLReader - PullRequest
0 голосов
/ 05 мая 2020

У меня очень большой 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")
  }
}

Ответы [ 2 ]

0 голосов
/ 05 мая 2020
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 голосов
/ 05 мая 2020

Попробуйте следующее:

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);
        }
    }

}
...