Почему 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);
    }
19
задан Joe Smith 19 February 2010 в 21:16
поделиться

2 ответа

Вы вызываете 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();
    }
}
31
ответ дан 30 November 2019 в 03:34
поделиться

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

6
ответ дан 30 November 2019 в 03:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: