2016-10-03 101 views
0

考慮下面的XML(例如):通過子元素循環使用的XmlReader

<root> 
    <foo>some data</foo> 
    <bar>some other data</bar> 
</root> 

我目前正在讀它:

reader.ReadToFollowing("root") 
if(reader.HasAttributes) { /* not relevant in this usecase*/ } 
while(reader.IsStartElement()) 
{ 
    reader.ReadStartElement() 
    var elementName = reader.LocalName; 
    var value = reader.ReadElementContentAs(typeof(ExpectedType),null); 
    //Process(elementName, value); 
    reader.ReadEndElement(); 
} 

如果我運行它像這樣,我得到了一個異常

'元素'是無效的XmlNodeType。在reader.ReadEndElement();

如果我刪除最後一行,則只執行一次。 foo被正確處理,bar不被讀取。

有什麼想法?

回答

0

我不明白你爲什麼想在這裏使用ReadStartElementReadEndElement方法。看一下我的代碼,Read方法將讀者推進到下一個元素,並返回true,直到XML文檔中剩下更多元素爲止,因此它完全符合您的要求。

 reader.ReadToFollowing("root"); 

     if (reader.HasAttributes) { /* not relevant in this usecase*/ } 

     while (reader.Read()) 
     { 
      var elementName = reader.LocalName; 
      var value = reader.ReadElementContentAsString(); 

      //Process(elementName, value); 
     } 
+0

如果我這樣做,我必須跳過元素之間的WhitespaceNodes,並且我得到了「ReadElementContentAs方法在節點類型EndElement上不受支持」。在第二個元素上的ReadElementContentAsString()... –

+0

嘗試在循環中跳過不是元素的所有東西:'if(reader.NodeType!= XmlNodeType.Element){continue; }' – sc3w

+0

看起來ReadElementContentAsString()也將讀者定位在下一個元素上。它應該這樣做嗎?如果沒有,那麼我發現了一個我正在使用的平臺上的錯誤(我正在智能設備上使用.Net CF克隆)。 Thx,它會解釋很多:-s –