2010-02-19 79 views
19

當我嘗試使用LINQ XmlReader類解析XML時,我看到了奇怪的行爲。下面的測試案例:它看起來像是在0121,還是在XmlReader上使用Read()方法之一,它錯過了輸入XML中的第二個bar元素。如果在</bar><bar>之間添加任何空格,則它將正確解析第二個bar元素。爲什麼XmlReader在沒有空白分隔符的情況下跳過每一個其他元素?

有沒有人有一個想法,爲什麼輸入流搞砸了,以及如何解決這個問題?

[Test] 
    [Explicit] 
    public void ShouldParseCorrectNumberOfElements() 
    { 
     var xml = @"<foo><bar>wtf</bar><bar>wtf2</bar></foo>"; 
     XmlReader xmlReader = XmlReader.Create(new MemoryStream(Encoding.UTF8.GetBytes(xml))); 

     int count = 0; 
     xmlReader.MoveToContent(); 
     while (xmlReader.Read()) 
     { 
      if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "bar") 
      { 
       var element = xmlReader.ReadOuterXml(); 
       Console.WriteLine("just got an " + element); 
       count++; 
      } 
     } 
     Assert.AreEqual(2, count); 
    } 
+0

循環可以通過使用'ReadToFollowing(「巴」)被顯著優化',而不是'閱讀()'(與喬恩的答案也適用)。 – 2014-04-22 16:34:12

+0

我有一個類似的情況,我在while循環中使用'ReadToFollowing'和'While'和'ReadOuterXml'。如果文檔使用換行符格式化,則它正常運行。當我有單行文檔時,它會跳過以下所有節點。 – 2015-01-12 15:24:51

回答

30

你打電話給ReadOuterXml,它會消耗元素並將「遊標」放在下一個元素之前。然後您再次調用Read,這會將光標移動到(例如移動到元素內的文本節點上)。

下面是你的循環替代:

while (!xmlReader.EOF) 
{ 
    Console.WriteLine(xmlReader.NodeType); 
    if (xmlReader.NodeType == XmlNodeType.Element && xmlReader.Name == "bar") 
    { 
     var element = xmlReader.ReadOuterXml(); 
     Console.WriteLine("just got an " + element); 
     count++;     
    } 
    else 
    { 
     xmlReader.Read(); 
    } 
} 
+0

哦,那個「一個一個」的感覺......再次感謝! – 2016-01-22 12:52:59

6

你或許跳過通過調用閱讀()中的while循環內循環本身的功能,然後ReadOuterXml()函數一條線嗎?

相關問題