C# 读取XML中的相邻元素

C# 读取XML中的相邻元素,c#,xml,xmltextreader,C#,Xml,Xmltextreader,我有一个很大的XML文件,所以我使用XMLTextReader。我在读取值时遇到问题,因为格式与我使用过的其他XML文件有点不同 <class> <column>Size</column><int>30</int> <column>TeamColor</column><string>red</string> ... </class> 如果可以使用xpath,

我有一个很大的XML文件,所以我使用XMLTextReader。我在读取值时遇到问题,因为格式与我使用过的其他XML文件有点不同

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

如果可以使用xpath,请从
上下文节点尝试
(以下同级::*)[1]
。这将沿以下同级轴选择元素(与上下文对等但按文档顺序排列的内容),然后返回序列的第一个元素。

您可以在
哈希表中获得所有列及其名称和关联值

请尝试使用以下代码段:

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"]);

除非存储上一个值,否则需要添加一个跳过条件,允许在它命中column元素时进行额外读取(对于同级),然后在下一个循环中正确处理任何额外读取


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

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