2010-02-19 86 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()函数一条线吗?

相关问题