XmlReader не распознает EndElement - PullRequest
       18

XmlReader не распознает EndElement

3 голосов
/ 22 августа 2011

У меня есть строка XML, форматирование которой не похоже на:

<SomeTag><Tag>tag 1</Tag><Tag>tag 2</Tag><Tag>tag 3</Tag><Tag>tag 4</Tag></SomeTag>

Когда я запускаю этот код:

using (XmlReader reader = XmlReader.Create(stream))
            {
                reader.MoveToContent();

                while (reader.Read())
                {
                    if ((reader.NodeType == XmlNodeType.Element) && (string.Compare(reader.Name, name, StringComparison.InvariantCultureIgnoreCase) == 0))
                    {
                        var element = (XElement)XNode.ReadFrom(reader);
                        yield return element;
                    }
                }
                reader.Close();
            }

Он распознает только тег 1 узла и тег 3 как элемент, а тег 2 и тег 4 - как текстовые узлы.

Почему?

Что мне сделать, чтобы это исправить?

К вашему сведению, если я добавлю форматирование с переводами строк после каждого тега, он будет работать, как и ожидалось, распознавая все теги как элементы. Однако у меня нет контроля над XML, который мне дан.

1 Ответ

3 голосов
/ 22 августа 2011

I подозреваю проблема в том, что XNode.ReadFrom уже позиционирует считыватель "на" начало следующего элемента - вы затем вызываете Read, и он перемещается по элементу и на следующий узел.

Это всего лишь предположение - это то, что XmlReader делает сложным :( Попробуйте сделать вызов Read условным, если вы только что позвонили ReadFrom. Что-то вроде этого:

using (XmlReader reader = XmlReader.Create(stream))
{
    reader.MoveToContent();

    while (!reader.EOF)
    {
        if (reader.NodeType == XmlNodeType.Element &&
            reader.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase))
        {
            var element = (XElement)XNode.ReadFrom(reader);
            yield return element;
        }
        else
        {
            reader.Read();
        }
    }
}
...