Nigdy nie mogę przewidzieć zachowania XMLReadera. Jakieś wskazówki na temat zrozumienia?

Wydaje mi się, że za każdym razem, gdy używam XMLReadera, kończę na kilku próbach i błędach próbujących dowiedzieć się, co mam zamiar przeczytać w porównaniu z tym, co czytam, a co przeczytałem. W końcu zawsze to rozumiem, ale nadal, po wielokrotnym użyciu, nie wydaje mi się, aby dobrze rozumiał, co naprawdę robi XMLReader, kiedy nazywam różne funkcje. Na przykład, gdy zadzwonię do odczytu za pierwszym razem, jeśli odczytuje znacznik początkowy elementu, czy jest on teraz na końcu znacznika elementu lub gotowy do rozpoczęcia czytania atrybutów elementu? Czy zna jeszcze wartości atrybutów, jeśli wywołam GetAttribute? Co się stanie, jeśli w tym momencie zadzwonię do ReadStartElement? Czy skończy czytać element początkowy lub poszukać następnego, pomijając wszystkie atrybuty? Co zrobić, jeśli chcę przeczytać wiele elementów - jaki jest najlepszy sposób na przeczytanie następnego elementu i określenie jego nazwy. Czy odczyt, a następnie praca IsStartElement, czy IsStartElement zwróci informacje o węźle po elemencie, który właśnie przeczytałem?

Jak widać, naprawdę nie rozumiem, na czym polega XMLReader podczas różnych faz jego czytania i jak na jego stan wpływają różne funkcje odczytu. Czy jest jakiś prosty wzór, którego po prostu nie zauważyłem?

Oto kolejny przykład problemu (zaczerpnięty z odpowiedzi):

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

Pierwszy problem, węzeł maszyny jest całkowicie pomijany. MoveToContent wydaje się przechodzić do zawartości elementu maszyny, co powoduje, że nigdy nie jest analizowany. Ponadto, jeśli pominiesz MoveToContent, pojawi się błąd: „„ Element ”jest nieprawidłowym typem XmlNodeType.” próbuję ReadElementString, którego nie mogę wyjaśnić.

Następny problem polega na tym, że podczas odczytu pierwszego elementu części ReadElementString wydaje się umieszczać czytnik na początku następnego elementu części po przeczytaniu. Powoduje to, że czytnik czyta na początku następnej pętli, przeskakując przez następny element części przeskakując w prawo do ostatniego elementu części. Ostatecznym wynikiem tego kodu jest:

Kod części 01a: prawe ramię

Kod części 03: Big Toe

Jest to doskonały przykład błędnego zachowania XMLReadera, który próbuję zrozumieć.

questionAnswers(2)

yourAnswerToTheQuestion