2012-04-14 10 views
5

Sono un programmatore principiante che inizia con C# e servizi Web.Utilizzo di XmlTextReader

Nel file Service.cs del mio servizio web, ho creare un metodo ReadXMLFile() dove sto cercando di leggere un file XML esistente, prendere i dati da esso e metterlo alle proprietà corrispondenti (DataMembers) che ho creato nel IService.cs file.

Il mio problema è che il mio codice non sta praticamente facendo nulla. Ho provato a cercare siti web e tutorial su questo, ma non c'è davvero molto, specialmente per un principiante come me. Qualcuno ha idea di come dovrei fare, perché quello che ho cercato finora è ovviamente sbagliato.

Di seguito è riportato il mio metodo ReadXMLFile().

void ReadXMLFile() 
{ 
    XmlTextReader reader = new XmlTextReader("ClassRoll.xml"); 
    reader.Read(); 
    while (reader.Read()) 
    { 
     if (reader.Name == "id") 
     { 
      id = reader.ReadString(); 
     } 
     else if (reader.Name == "firstname") 
     { 
      link = reader.ReadString(); 
     } 
     else if (reader.Name == "lastname") 
     { 
      description = reader.ReadString(); 
     } 
     else if (reader.Name == "count") 
     { 
      description = reader.ReadString(); 
     } 
     else if (reader.Name == "testscore") 
     { 
      description = reader.ReadString(); 
     } 
    } 
} 

Questo è un esempio del mio file xml

<classroll> 
    <student> 
    <id>101010</id> 
    <lastname>Smith</lastname> 
    <firstname>Joe</firstname> 
    <testscores count="5"> 
     <score>65</score> 
     <score>77</score> 
     <score>67</score> 
     <score>64</score> 
     <score>80</score> 
    </testscores> 
    </student> 
</classroll> 
+0

Si possono trovare [Best practice per analizzare i file XML] (http://stackoverflow.com/q/55828/1048330) utile – tenorsax

+0

Si dovrebbe condividere il file XML o un campione di esso se è troppo grande, così possiamo vedere la sua struttura. –

+1

Non si dovrebbe utilizzare direttamente XmlTextReader. Usa invece 'XmlReader.Create()'. –

risposta

3

Probabilmente stai manca IsStartElement condizione() nel ciclo while:

while (reader.Read()) 
{ 
    if (reader.IsStartElement()) 
    { 
     if (reader.Name == "id") 
     { 
      id = reader.ReadString(); 
     } 
... 
} 

Inoltre, sarebbe più facile per usa XPath o LINQ to XML per leggere il tuo XML, ovviamente dipende dal file. Ecco alcuni esempi: XPath e LINQ.

EDIT: dopo aver visto i dettagli dei file XML

è necessario aggiornare la logica per tenere traccia di corrente student e la sua testscores. Inoltre, tieni presente che count è un attributo. Può diventare piuttosto complicato, ti suggerisco di dare un'occhiata agli esempi sopra menzionati.

+3

Sono d'accordo sul fatto che dovresti usare LINQ to XML (classe XElement) a meno che tu non abbia una buona ragione per non farlo - l'unica buona ragione per cui sono consapevole è che il tuo documento è troppo grande per racchiuderlo tutto in memoria in una volta. – Mason

1

penso, che si ottiene il miglior risultato utilizzando XmlDocument

public void ReadXML() 
{ 
    XmlDocument xmlDoc = new XmlDocument(); 
    xmlDoc.Load("<name file>.xml"); 
    xmlEntities = new List<XmlEntity>(); 

    foreach(XmlNode item in xmlDoc.ChildNodes) 
    { 
     GetChildren(item); 
    } 
} 

private void GetChildren(XmlNode node) 
{ 
    if (node.LocalName == "Строка") 
    { 
     //<you get the element here and work with it> 
    } 
    else 
    { 
     foreach (XmlNode item in node.ChildNodes) 
     { 
      GetChildren(item); 
     } 
    } 
} 
0

Il motivo per la sua non funziona, perché, ad esempio: quando reader.Name == "Nome" è vero, ma la sua non è vero con il suo valore elementi. Che cosa significa esattamente che l'oggetto lettore legge il prossimo Nodetype, che è XmlNodeType.Element. Quindi, in questo caso, guarda il tuo file XML, usando reader.Read(); la funzione legge nuovamente il nodo successivo, che è XmlNodeType.Text, e il suo valore è quindi Joe. Ti fornisco un esempio di versione funzionante.

void ReadXMLFile() 
{ 
XmlTextReader reader = new XmlTextReader("ClassRoll.xml"); 
reader.Read(); 
while (reader.Read()) 
{ 
    if (reader.Name == "id") 
    { 
     reader.Read(); 
     if(reader.NodeType == XmlNodeType.Text) 
     { 
      id = reader.Value; 
      reader.Read(); 
     } 

    } 
} 

}