0

XMLReader を使用して巨大な XML ファイル (250 MB) を読み取り、特定の要素のみを一般的な List に追加しています。リストに値を正しく追加できません。リストに null 値を取得しています。ご協力をお願いします 以下は、私が使用しているクラスです。

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>
4

2 に答える 2

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);
于 2013-07-25T05:02:23.123 に答える
0

Item1または、リストItem2に null 値が表示されますか?test

XmlNodeType.Element犯人は、トラバースされたノードが であるたびに、オブジェクトをリストに追加しているコードのようです。スイッチに基づいて; element が type の場合Item1、はテスト オブジェクトになり、Item2typeの場合、Item1 は常になります。また、コードにさらに多くの要素タイプがある場合、両方の値が null であるオブジェクトがテスト オブジェクトに挿入されます。nullItem2null

于 2013-07-25T04:50:42.633 に答える