Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XMLReader读取特定元素并向通用列表添加值_C#_Generics_Xmlreader - Fatal编程技术网

C# 使用XMLReader读取特定元素并向通用列表添加值

C# 使用XMLReader读取特定元素并向通用列表添加值,c#,generics,xmlreader,C#,Generics,Xmlreader,我正在使用XMLReader读取一个巨大的XML文件(250 MB),并且只向通用列表添加特定元素。我无法将值正确添加到列表中。我在列表中得到空值。我将感谢您的帮助,以下是我正在使用的类: public class SomeInfo { public string Item1 { get; set; } public string Item2 { get; set; } } 我读取XML的代码如下所示: using (XmlReader read

我正在使用XMLReader读取一个巨大的XML文件(250 MB),并且只向通用列表添加特定元素。我无法将值正确添加到列表中。我在列表中得到空值。我将感谢您的帮助,以下是我正在使用的类:

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

                    }
使用(XmlReader=XmlReader.Create(文件)
)
{
列表测试=新列表();
while(reader.Read())
{
var testObject=new SomeInfo();
if(reader.NodeType==XmlNodeType.Element)
{
字符串名称=reader.name;
交换机(名称)
{
案例“项目1”:
reader.Read();
testObject.item1=reader.Value;
打破
案例“项目2”:
reader.Read();
testObject.item2=reader.Value;
打破
}
添加(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>

125
ab41gh80020gh140f6
42ae3de3
7549tt80384
c7dggf66e4
865
ab41gh80020gh140f6
42AEJ3DE3
7549KLJ80384
c7df6kk6e4
895
AB41GJGH80020GH140F6
42aehkh3de3
754980384
C7DFJ66E4

您是否为
项目1
项目2
设置了空值,还是在
测试
列表中看到了空值

罪魁祸首似乎是您的代码,每次遍历的节点是
XmlNodeType.Element
,您都在将对象添加到列表中。根据您的开关;如果元素的类型为
Item1
,则测试对象中的
Item2
将为
null
,对于
Item2
类型,Item1将为l总是
null
。另外,如果您的代码有更多的元素类型,那么将两个值都为null的对象插入到您的测试对象中。

更改如下

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;

}
私有列表ProcessItems(XmlTextReader)
{
列表测试=新列表();
while(reader.Read())
{
if(reader.Name.Equals(“项”))
{
var testObject=new SomeInfo();
while(reader.Read())
{
if(reader.NodeType==XmlNodeType.EndElement&&reader.Name.Equals(“项”))
{
打破
}
if(reader.NodeType==XmlNodeType.Element)
{
开关(reader.Name)
{
案例“项目1”:
testObject.Item1=reader.ReadString();
打破
案例“项目2”:
testObject.Item2=reader.ReadString();
打破
}
}
}
添加(testObject);
}
}
回归试验;
}
用法:

XmlTextReader reader = new XmlTextReader(filepath));
List<SomeInfo> result = ProcessItems(reader);
XmlTextReader=newxmltextreader(filepath));
列表结果=ProcessItems(读卡器);

我尝试了这种方法,它为列表中的每个项目创建了两行。如果xml中每个项目都包含一个值,那么通过使用上述代码,列表将包含两行,分别为item1=somevalue、item2=null、item1=null和item2=somevalue。有什么办法解决这个问题吗?我同意这就是问题所在。基于此,我应该如何解决这个问题将数据添加到列表中?
reader.Read()
从流中读取下一个节点。在您的算法中,对于像
main项、XItem、Item1这样的每个节点,您正在创建
SomeInfo
类的实例。因此,您的列表将有19个元素,而不是3个。我建议您