我正在使用大量不同的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进行迭代器的估算。
因此,在寻求有关如何估算它的意见时,任何想法都会受到赞赏
答案 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();
}
}
}
}