Чтение соседних элементов в XML

У меня есть большой файл 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
         }
     }
}

person superwpf    schedule 06.11.2012    source источник


Ответы (3)


Вы можете получить все столбцы с их именами и связанными значениями в файле 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"]);
person Furqan Safdar    schedule 06.11.2012

Если вы можете использовать xpath, из узла контекста <column> попробуйте (following-sibling::*)[1]. Это выберет элементы * по оси следующего брата (вещи, которые равны контексту, но идут после в порядке документа), а затем вернет первый элемент последовательности.

person nine9ths    schedule 06.11.2012

Если вы не сохраните предыдущее значение, вам нужно будет добавить условие пропуска, позволяющее вам сделать дополнительное чтение (для родственного элемента), когда оно попадает в элемент столбца, а затем правильно обрабатывать любые дополнительные чтения в следующем цикле.


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;
             }
         }
     }
}
person alistair    schedule 06.11.2012