2012-11-06 111 views
0

我有一個很大的XML文件,所以我使用XMLTextReader。由於格式與我所使用的其他XML文件有點不同,因此我無法讀取值。閱讀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 
     } 
    } 
} 

回答

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

如果你可以使用XPath,從<column>上下文節點嘗試(following-sibling::*)[1]。這將沿着兄弟軸選擇元素*(與上下文同級但是按文檔順序排列的東西),然後返回序列的第一個元素。

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