Ich kann das Verhalten von XMLReader niemals vorhersagen. Irgendwelche Tipps zum Verständnis?

Es scheint, dass ich jedes Mal, wenn ich einen XMLReader verwende, eine Menge Versuch und Irrtum versuche, herauszufinden, was ich lesen werde und was ich lese und was ich gerade lese. Ich finde es am Ende immer heraus, aber ich habe nach mehrmaliger Verwendung immer noch keinen festen Überblick darüber, was ein XMLReader tatsächlich tut, wenn ich die verschiedenen Funktionen aufrufe. Wenn ich zum Beispiel das erste Mal Read aufrufe, wenn es ein Element-Start-Tag liest, ist es jetzt am Ende des Element-Tags oder bereit, mit dem Lesen der Attribute des Elements zu beginnen? Kennt es die Werte der Attribute noch, wenn ich GetAttribute aufrufe? Was passiert, wenn ich an dieser Stelle ReadStartElement aufrufe? Ist das Lesen des Startelements beendet oder wird nach dem nächsten gesucht, wobei alle Attribute übersprungen werden? Was ist, wenn ich mehrere Elemente lesen möchte? Wie kann ich am besten versuchen, das nächste Element zu lesen und seinen Namen zu ermitteln? Funktioniert Read, gefolgt von IsStartElement, oder gibt IsStartElement nach dem gerade gelesenen Element Informationen über den Knoten zurück?

Wie Sie sehen, fehlt mir wirklich ein Verständnis dafür, wo sich ein XMLReader in den verschiedenen Phasen seines Lesens befindet und wie sich die verschiedenen Lesefunktionen auf seinen Zustand auswirken. Gibt es ein einfaches Muster, das ich einfach übersehen habe?

Hier ist ein weiteres Beispiel für das Problem (aus den Antworten entnommen):

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"));
         }
      }
   }
}

Erstes Problem, der Maschinenknoten wird komplett übersprungen. MoveToContent scheint sich zum Inhalt des Maschinenelements zu bewegen, wodurch es niemals analysiert wird. Wenn Sie MoveToContent überspringen, erhalten Sie außerdem die Fehlermeldung: "'Element' ist ein ungültiger XmlNodeType." versuche ReadElementString, was ich nicht ganz erklären kann.

Das nächste Problem besteht darin, dass ReadElementString beim Lesen des ersten Teilelements den Reader an den Anfang des nächsten Teilelements nach dem Lesen zu positionieren scheint. Dies bewirkt, dass der Reader. Read am Anfang der nächsten Schleife das nächste Teilelement überspringt und direkt zum letzten Teilelement springt. Die endgültige Ausgabe dieses Codes lautet also:

Teil Code 01a: Rechter Arm

Artikelcode 03: Großer Zeh

Dies ist ein hervorragendes Beispiel für das verwirrende Verhalten von XMLReader, das ich zu verstehen versuche.

Antworten auf die Frage(2)

Ihre Antwort auf die Frage