Sembra che ogni volta che utilizzo un XMLReader, finisco con un sacco di tentativi ed errori cercando di capire cosa sto per leggere rispetto a quello che sto leggendo rispetto a ciò che ho appena letto. Alla fine lo capisco sempre, ma, dopo averlo usato numerose volte, non riesco ancora a capire cosa sta facendo un XMLReader quando chiamo le varie funzioni. Ad esempio, quando chiamo la lettura la prima volta, se legge un tag di inizio elemento, è ora alla fine del tag dell'elemento o è pronto per iniziare a leggere gli attributi dell'elemento? Conosce GetAttribute per conoscere i valori degli attributi? Cosa succederà se chiamo ReadStartElement a questo punto? Finirà di leggere l'elemento iniziale, o cercherà quello successivo, saltando tutti gli attributi? Cosa succede se voglio leggere un numero di elementi: qual è il modo migliore per provare a leggere l'elemento successivo e determinare quale sia il suo nome. Leggi letto seguito da IsStartElement o IsStartElement restituirà informazioni sul nodo in seguito all'elemento che ho appena letto?Non riesco mai a prevedere il comportamento di XMLReader. Qualche consiglio su come capire?
Come potete vedere, mi manca davvero una comprensione di dove si trova un XMLReader durante le varie fasi della sua lettura e di come il suo stato sia influenzato da varie funzioni di lettura. C'è qualche schema semplice che ho semplicemente omesso di notare?
Ecco un altro esempio del problema (ricavate dalle risposte):
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"));
}
}
}
}
Primo problema, il nodo macchina è saltata completamente. MoveToContent sembra spostarsi sul contenuto dell'elemento macchina causando che non venga mai analizzato. Inoltre, se si ignora MoveToContent, viene visualizzato un errore: "'Elemento' è un XmlNodeType non valido." provando a ReadElementString, che non riesco a spiegare.
Il problema successivo è che, leggendo il primo elemento parte, ReadElementString sembra posizionare il lettore all'inizio dell'elemento parte successivo dopo la lettura. Ciò provoca il lettore. Leggi all'inizio del ciclo successivo per saltare il successivo elemento della parte saltando fino all'ultima parte. Così il risultato finale di questo codice è: Codice
Parte 01a: Braccio Destro
Parte Codice 03: Big Toe
Questo è un primo esempio del comportamento di confusign XMLReader che sto cercando di capire.
+1 per stick con Read() –