Parece que cada vez que uso un XMLReader, termino con un montón de intentos de prueba y ensayo tratando de descubrir lo que voy a leer contra lo que estoy leyendo y lo que acabo de leer. Al final siempre lo entiendo, pero aún así, después de usarlo en numerosas ocasiones, no parezco tener una idea clara de lo que realmente hace un XMLReader cuando llamo a varias funciones. Por ejemplo, cuando llamo a Read la primera vez, si lee una etiqueta de inicio de elemento, ¿está ahora al final de la etiqueta del elemento o lista para comenzar a leer los atributos del elemento? ¿Conoce los valores de los atributos aún si llamo a GetAttribute? ¿Qué pasará si llamo a ReadStartElement en este punto? ¿Terminará de leer el elemento de inicio, o buscará el siguiente, omitiendo todos los atributos? ¿Qué ocurre si quiero leer una serie de elementos? ¿Cuál es la mejor manera de tratar de leer el siguiente elemento y determinar su nombre? ¿Leerá seguido de IsStartElement o IsStartElement devolverá información sobre el nodo que sigue al elemento que acabo de leer?Nunca puedo predecir el comportamiento de XMLReader. ¿Algún consejo sobre la comprensión?
Como puedes ver, realmente no entiendo dónde está un XMLReader durante las diversas fases de su lectura y cómo su estado se ve afectado por varias funciones de lectura. ¿Hay algún patrón simple que simplemente no he notado?
Aquí hay otro ejemplo del problema (tomado de las respuestas):
string input = "<machine code=\"01\">The Terminator" +
"<part code=\"01a\">Right Arm</part>" +
"<part code=\"02\">Left Arm</part>" +
"<part code=\"03\">Big Toe</part>" +
"</machine>";
using (System.IO.StringReader sr = new System.IO.StringReader(input))
{
using (XmlTextReader reader = new XmlTextReader(sr))
{
reader.WhitespaceHandling = WhitespaceHandling.None;
reader.MoveToContent();
while(reader.Read())
{
if (reader.Name.Equals("machine") && (reader.NodeType == XmlNodeType.Element))
{
Console.Write("Machine code {0}: ", reader.GetAttribute("code"));
Console.WriteLine(reader.ReadElementString("machine"));
}
if(reader.Name.Equals("part") && (reader.NodeType == XmlNodeType.Element))
{
Console.Write("Part code {0}: ", reader.GetAttribute("code"));
Console.WriteLine(reader.ReadElementString("part"));
}
}
}
}
El primer problema, el nodo de la máquina se omite por completo. MoveToContent parece moverse al contenido del elemento de la máquina haciendo que nunca se analice. Además, si omite MoveToContent, obtendrá un error: "'Element' es un XmlNodeType no válido." intentando ReadElementString, que no puedo explicar del todo.
El siguiente problema es que, mientras se lee el elemento de la primera parte, ReadElementString parece posicionar el lector al principio del elemento de la parte siguiente después de la lectura. Esto hace que el lector lea. Al comienzo del siguiente ciclo, omita el siguiente elemento de la parte que salta directamente al último elemento de la parte. Por lo que el resultado final de este código es: Código
parte 01a: Brazo derecho
Parte código 03: Dedo gordo
Este es un buen ejemplo del comportamiento de confusign XMLReader que estoy tratando de entender.
+1 para pegar con Read() –