我正在使用XMLReader读取一个巨大的XML文件(250 MB),并仅将特定元素添加到通用List中。我无法正确地向列表中添加值。我在List中获取空值。我将感谢您的帮助以下是我正在使用的类:
public class SomeInfo
{
public string Item1 { get; set; }
public string Item2 { get; set; }
}
我读取XML的代码如下:
using (XmlReader reader = XmlReader.Create(file)
)
{
List<SomeInfo> test = new List<SomeInfo>();
while (reader.Read())
{
var testObject = new SomeInfo();
if (reader.NodeType == XmlNodeType.Element)
{
string name = reader.Name;
switch (name)
{
case "Item1":
reader.Read();
testObject.item1= reader.Value;
break;
case "Item2":
reader.Read();
testObject.item2= reader.Value;
break;
}
test.Add(testObject);
}
}
示例XML:这是一个巨大的xml文件,我只需要读取一些元素并添加到列表中。在上面的代码中,我只读取Item1和Item2而不关心Xitem,Bitem和Citem标签
<mainItem>
<Item>
<Xitem>125</Xitem>
<Item1>ab41gh80020gh140f6</Item1>
<BItem>42ae3de3</BItem>
<Item2>7549tt80384</Item2>
<Citem>c7dggf66e4</Citem>
</Item>
<Item>
<Xitem>865</Xitem>
<Item1>ab41gh80020gh140f6</Item1>
<BItem>42aejj3de3</BItem>
<Item2>7549kljj80384</Item2>
<Citem>c7df6kk6e4</Citem>
</Item>
<Item>
<Xitem>895</Xitem>
<Item1>ab41gjgjgh80020gh140f6</Item1>
<BItem>42aehkh3de3</BItem>
<Item2>754980384</Item2>
<Citem>c7dfjj66e4</Citem>
</Item>
</mainItem>
答案 0 :(得分:1)
更改如下
private List<SomeInfo> ProcessItems(XmlTextReader reader)
{
List<SomeInfo> test = new List<SomeInfo>();
while (reader.Read())
{
if (reader.Name.Equals("Item"))
{
var testObject = new SomeInfo();
while (reader.Read())
{
if (reader.NodeType == XmlNodeType.EndElement && reader.Name.Equals("Item"))
{
break;
}
if (reader.NodeType == XmlNodeType.Element)
{
switch (reader.Name)
{
case "Item1":
testObject.Item1 = reader.ReadString();
break;
case "Item2":
testObject.Item2 = reader.ReadString();
break;
}
}
}
test.Add(testObject);
}
}
return test;
}
用法:
XmlTextReader reader = new XmlTextReader(filepath));
List<SomeInfo> result = ProcessItems(reader);
答案 1 :(得分:0)
您是否为Item1
或Item2
设置了空值,或者您在test
列表中看到空值。
罪魁祸首似乎是您的代码,每次遍历的节点都是XmlNodeType.Element
时,您将对象添加到列表中。根据你的开关;如果元素的类型为Item1
,则Item2
在测试对象中为null
,对于Item2
类型,则Item1将始终为null
。此外,如果您的代码具有更多元素类型,则将两个值均为null的对象插入到测试对象中。