Подтвердить что ты не робот

Почему XmlReader пропускает каждый другой элемент, если нет разделителя пробелов?

Я вижу странное поведение, когда пытаюсь разобрать XML, используя класс LINQ XmlReader. Тестовый пример ниже: похоже, я использую (XElement)XNode.ReadFrom(xmlReader) или один из методов Read() в XmlReader, он пропускает второй элемент bar во входном XML. Если между </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);
    }
4b9b3361

Ответ 1

Вы вызываете ReadOuterXml, который будет потреблять элемент и помещать "курсор" непосредственно перед следующим элементом. Затем вы вызываете Read, который перемещает курсор (например, в текст node внутри элемента).

Здесь альтернатива вашему циклу:

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

Ответ 2

Возможно, вы пропустили строку, вызвав функцию Read() в течение цикла while, а затем функцию ReadOuterXml() внутри самого цикла?