在C#中为非常大的xml文件估计迭代元素

时间:2018-11-01 08:17:52

标签: c# xml xsd xmldocument xmlreader

我正在使用大量不同的xml文件,但我不知道文件中的迭代元素。

我所说的迭代元素是在整个xml文件中重复的元素(在xsd字段中也被视为maxOccurs =“ unbounded”)。

例如,订单文件可能包含一个称为order的重复元素

我收到的一些结构示例是

<order>
   <order>...</order>
   <order>...</order>
</orders>

<products>
   <product>...</product>
   <product>...</product>
</products>

<root>
   <element>...</element>
   <element>...</element>
</root>

<products>
   <section>
    <someelement>content</someelement>
    <item>...</item>
    <item>...</item>
    <item>...</item>
    <item>...</item>
   </section>
</products>

在上面的示例中,迭代器/重复器称为:

orders > order
products > product
root > element
products > section > item

我通常的估算迭代器的方法是从生成和xsd模式将完整的xml文件加载到xml文档中,然后从中找到带有子元素的第一个maxOccurs。 效果很好,但是使用xmldocument不适用于很大的xml文件(gb大小)。

对于这些,我需要使用xmlreader,但由于无法使用xsd技巧,我不知道如何使用xmlreader进行迭代器的估算。

因此,在寻求有关如何估算它的意见时,任何想法都会受到赞赏

1 个答案:

答案 0 :(得分:0)

尝试以下将结果放入字典的代码

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


namespace ConsoleApplication75
{
    class Program
    {
        const string FILENAME = @"c:\temp\test.xml";
        static void Main(string[] args)
        {
            Node.ParseChildren(FILENAME);
        }


    }
    public class Node
    {
        public static XmlReader reader;
        public static Dictionary<string, int> dict = new Dictionary<string, int>();

        public static void ParseChildren(string filename)
        {
            reader = XmlReader.Create(filename);
            reader.MoveToContent();
            string name = "";
            reader.ReadStartElement();
            ParseChildrenRecursive(name);
        }

        public static void ParseChildrenRecursive(string path)
        {
            while (!reader.EOF)
            {
                if (reader.NodeType == XmlNodeType.EndElement)
                {
                    reader.ReadEndElement();
                    break;
                }
                if (reader.IsStartElement())
                {
                    string childName = reader.LocalName;
                    string newPath = path + " > " + childName;
                    if(dict.ContainsKey(newPath))
                    {
                        dict[newPath] += 1;
                    }
                    else
                    {
                        dict.Add(newPath, 1);
                    }
                    reader.ReadStartElement();
                    ParseChildrenRecursive(newPath);
                }
                if ((reader.NodeType != XmlNodeType.StartElement) && (reader.NodeType != XmlNodeType.EndElement))
                   reader.Read();
            }
        }
    }

}