如果没有空格分隔符,为什么XmlReader会跳过所有其他元素?

时间:2010-02-19 21:16:23

标签: c# xml linq whitespace

当我尝试使用LINQ XmlReader类解析XML时,我看到了奇怪的行为。下面的测试用例:看起来我是否在XmlReader上使用(XElement)XNode.ReadFrom(xmlReader)或其中一个Read()方法,它错过了输入XML中的第二个bar元素。如果在</bar><bar>之间添加了任何空格,那么它将正确解析第二个bar元素。

有没有人知道为什么输入流搞砸了以及如何解决这个问题?

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

2 个答案:

答案 0 :(得分:31)

您正在调用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();
    }
}

答案 1 :(得分:6)

您是否可以通过在while循环条件中调用Read()函数然后在循环内调用ReadOuterXml()函数来跳过一行?