Nunca puedo predecir el comportamiento de XMLReader. ¿Algún consejo sobre la comprensión?

Parece que cada vez que uso un XMLReader, termino con un montón de prueba y error tratando de averiguar qué estoy a punto de leer en comparación con lo que estoy leyendo en comparación con lo que acabo de leer. Siempre lo descubro al final, pero aún así, después de usarlo varias veces, parece que no tengo una idea clara de lo que está haciendo un XMLReader cuando llamo a las diversas funciones. Por ejemplo, cuando llamo Leer por primera vez, si lee una etiqueta de inicio de elemento, ¿está ahora al final de la etiqueta de elemento, o está listo para comenzar a leer los atributos del elemento? ¿Conoce los valores de los atributos todavía si llamo a GetAttribute? ¿Qué pasará si llamo a ReadStartElement en este momento? ¿Terminará de leer el elemento de inicio o buscará el siguiente, omitiendo todos los atributos? ¿Qué sucede si deseo leer varios elementos? ¿Cuál es la mejor manera de intentar leer el siguiente elemento y determinar cuál es su nombre? ¿Seguirá Read seguido por el trabajo de IsStartElement o IsStartElement devolverá información sobre el nodo siguiendo el elemento que acabo de leer?

Como puede ver, realmente no entiendo dónde se encuentra un XMLReader durante las distintas 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 haya 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"));
         }
      }
   }
}

Primer problema, el nodo de la máquina se omite por completo. MoveToContent parece moverse hacia el contenido del elemento de la máquina, lo que hace que nunca se analice. Además, si omites MoveToContent, obtendrás un error: "'Elemento' no es un XmlNodeType válido". Intentando ReadElementString, que no puedo explicar.

El siguiente problema es que, al leer el primer elemento de la parte, ReadElementString parece posicionar al lector al comienzo del siguiente elemento de la parte después de leer. Esto hace que el lector. Lea al comienzo del siguiente bucle para saltar el siguiente elemento de la parte saltando directamente al último elemento de la parte. Así que la salida final de este código es:

Código de pieza 01a: Brazo derecho

Código de pieza 03: dedo gordo del pie

Este es un excelente ejemplo del comportamiento de confusign de XMLReader que estoy tratando de entender.

Respuestas a la pregunta(2)

Su respuesta a la pregunta