0

大きなXMLファイルがあるので、XMLTextReaderを使用しています。フォーマットが他のXMLファイルと少し異なるため、値を読み取るのに問題があります。

<class>
   <column>Size</column><int>30</int>
   <column>TeamColor</column><string>red</string>
   ...
</class>

サイズを読み取って値30を取得するにはどうすればよいですか?私は現在持っています

while (reader.Read())
{
     if (reader.NodeType == XmlNodeType.Element)                    
         element = reader.Name;  
     else if (reader.NodeType == XmlNodeType.Text)
     {
         if (element == "column")
         {
             if(reader.Value == "Size")
             //can get true here, but can't return the int value next to it
         }
     }
}
4

3 に答える 3

0

xpathを使用できる場合は、<column>コンテキストノードから試してください(following-sibling::*)[1]。これにより、*次の兄弟軸に沿って要素(コンテキストとピアであるが、ドキュメントの順序で後に続くもの)が選択され、シーケンスの最初の要素が返されます。

于 2012-11-06T02:58:49.137 に答える
0

で、名前と関連する値を持つすべての列を取得できますHashtable

次のコードスニペットを使用してみてください。

Hashtable hashTable = new Hashtable();
int intVal;
string prevColumnName = "";

while (reader.Read())
{
    if (reader.NodeType == XmlNodeType.Element)
    {
        element = reader.Name;
    }
    else if (reader.NodeType == XmlNodeType.Text)
    {
        switch (element.ToLower())
        {
            case "column":
                prevColumnName = reader.Value;
                hashTable.Add(reader.Value, null);
                break;
            case "int":
                if (int.TryParse(reader.Value, out intVal))
                    hashTable[prevColumnName] = intVal;
                break;
            case "string":
                hashTable[prevColumnName] = reader.Value;
                break;
        }
    }
}

使用法:

int size = Convert.ToInt32(hashTable["Size"]);
于 2012-11-06T03:18:44.073 に答える
0

前の値を保存しない限り、スキップ条件を追加して、列要素にヒットしたときに(兄弟に対して)追加の読み取りを行い、次のループで追加の読み取りを適切に処理できるようにする必要があります。


bool skipRead = false;
while (skipRead || reader.Read())
{
     skipRead = false;
     if (reader.NodeType == XmlNodeType.Element)                    
         element = reader.Name;  
     else if (reader.NodeType == XmlNodeType.Text)
     {
         if (element == "column")
         {
             if (Reader.Read())
             {
               if(reader.NodeType == XmlNodeType.Element && reader.Name == "Size")
               {
                   // do whatever you need to here with reader.Value. 
                   // E.g size = (int) reader.Value
                   skipRead = false;
                   continue;
               } // Additional ifs for other elements in column can go here.
               else
               {
                   skipRead = true;
                   continue;
               }
             }
             else
             {
              break;
             }
         }
     }
}
于 2012-11-06T05:55:49.677 に答える