Я вижу странное поведение, когда я пытаюсь проанализировать 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);
}
Вы вызываете 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();
}
}
Возможно, вы пропустите строку, вызвав функцию Read () в условии цикла while, а затем функцию ReadOuterXml () внутри самого цикла?