c# - pvc - separadores de ambientes modernos
¿Por qué XmlReader omite todos los demás elementos si no hay un separador de espacios en blanco? (2)
¿Es posible que esté saltando una línea llamando a la función Read () dentro de la condición del bucle while y luego a la función ReadOuterXml () dentro del propio loop?
Estoy viendo un comportamiento extraño cuando intento analizar XML usando la clase LINQ XmlReader. Caso de prueba a continuación: parece que si uso (XElement)XNode.ReadFrom(xmlReader)
o uno de los métodos de Read()
en XmlReader, pierde los elementos de la segunda bar
en el XML de entrada. Si se agrega algún espacio en blanco entre </bar>
y <bar>
entonces se analizará correctamente el segundo elemento de bar
.
¿Alguien tiene una idea de por qué la secuencia de entrada se confunde y cómo solucionar este problema?
[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);
}
Está llamando a ReadOuterXml
, que consumirá el elemento y colocará el "cursor" justo antes del siguiente elemento. A continuación, vuelve a llamar a Read
, que mueve el cursor (por ejemplo, al nodo de texto dentro del elemento).
Aquí hay una alternativa a su bucle:
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();
}
}