我有一个6gb的xml文件,我正在使用xmlreader遍历该文件。文件很大,但我无能为力。我使用linq,但大小不允许我使用xdocument,因为我得到一个outofmemory错误。
我使用xmlreader循环遍历整个文件并提取所需内容。我包括一个示例xml文件。
基本上,我就是这么做的:
找到标签容器。如果找到,则检索属性“id”。
如果“id”以local开头,那么这就是我要读的内容。
读卡器循环,直到找到具有值单元格的标记族
找到时,循环reader.read(),直到找到标记的重要值。
一旦找到,读取重要值的值。
我已经完成了这个容器,所以继续循环,直到找到下一个容器(这就是中断进入的地方)。
这是我如何读取文件并找到相关值的简化版本。
while (myReader.Read())
{
if ((myReader.Name == "CONTAINER"))
{
if (myReader.HasAttributes)
{
string Attribute = myReader.GetAttribute("id");
if (Attribute.IndexOf("LOCAL_") >= 0)
{
while (myReader.Read())
{
if (myReader.Name == "FAMILY")
{
myReader.Read();//read value
string Family = myReader.Value;
if (Family == "CELL_FDD")
{
while (myReader.Read())
{
if ((myReader.Name == "IMPORTANT_VALUE"))
{
myReader.Read();
string Counter = myReader.Value;
Console.WriteLine(Attribute + " (found: " + Counter + ")");
break;
}
}
}
}
}
}
}
}
}
这是XML:
<es:esFD xmlns:es="File.xsd">
<vs:vsFD xmlns:vs="OTHER_FILE.xsd">
<CONTAINER id="LOCAL_CONTAINER1">
<ATTRIBUTES>
<FAMILY>CELL_FDD</FAMILY>
<CELL_FDD>
<VAL1>1.1.2.3</VAL1>
<VAL2>JSMITH</VAL2>
<VAL3>320</VAL3>
<IMPORTANT_VALUE>VERY</IMPORTANT_VALUE>
<VAL4>320</VAL4>
</CELL_FDD>
<FAMILY>BLAH</FAMILY>
<BLAH>
<VAL1>1.4.43.3</VAL1>
<VAL2>NA</VAL2>
<VAL3>349</VAL3>
<IMPORTANT_VALUE>NA</IMPORTANT_VALUE>
<VAL4>43</VAL4>
<VAL5>00</VAL5>
<VAL6>12</VAL6>
</BLAH>
</ATTRIBUTES>
</CONTAINER>
<CONTAINER id="FOREIGN_ELEMENT1">
<ATTRIBUTES>
<FAMILY>CELL_FDD</FAMILY>
<CELL_FDD>
<VAL1>1.1.2.3</VAL1>
<VAL2>JSMITH</VAL2>
<VAL3>320</VAL3>
<IMPORTANT_VALUE>VERY</IMPORTANT_VALUE>
<VAL4>320</VAL4>
</CELL_FDD>
<FAMILY>BLAH</FAMILY>
<BLAH>
<VAL1>1.4.43.3</VAL1>
<VAL2>NA</VAL2>
<VAL3>349</VAL3>
<IMPORTANT_VALUE>NA</IMPORTANT_VALUE>
<VAL4>43</VAL4>
<VAL5>00</VAL5>
<VAL6>12</VAL6>
</BLAH>
</ATTRIBUTES>
</CONTAINER>
</vs:vsFD>
</es:esFD>
我怎样才能从最内部的循环中分离出来,从而达到最上面的循环?
最佳答案
使用单独的方法可以更容易地控制循环:
while (myReader.Read())
{
if ((myReader.Name == "CONTAINER"))
{
ProcessContainerElement(myReader);
}
}
在
ProcessContainerElement
方法中,您可以在确定需要开始查找下一个容器元素时return
。private void ProcessContainerElement(XmlReader myReader)
{
while (whatever)
{
if ((myReader.Name == "IMPORTANT_VALUE"))
{
myReader.Read();
string Counter = myReader.Value;
Console.WriteLine(Attribute + " (found: " + Counter + ")");
return;
}
}
}
关于c# - 通过XML进行迭代?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23503001/