2012-04-14 11 views
5

Jestem początkującym programistą zaczynającym od C# i usług internetowych.Używanie XmlTextReader

W pliku mojego serwisu WWW Service.cs, tworzę ReadXMLFile() metodę gdzie próbuję odczytać istniejącego pliku XML, należy wykonać z niego dane i umieścić go do właściwości odpowiadających (DataMembers), który został utworzony w IService.cs plik.

Mój problem polega na tym, że mój kod zasadniczo nic nie robi. Próbowałem już szukać stron internetowych i tutoriali na ten temat, ale naprawdę niewiele tam jest, szczególnie dla początkujących, takich jak ja. Ktoś ma pojęcie, jak powinienem to zrobić, ponieważ to, co próbowałem do tej pory, jest oczywiście błędne.

Poniżej znajduje się moja metoda 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(); 
     } 
    } 
} 

ten jest przykładem mojego pliku 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

można znaleźć [najlepszych praktyk w celu analizowania plików xml] (http://stackoverflow.com/q/55828/1048330) użyteczna – tenorsax

+0

Należy udostępnić plik XML lub próbkę nim jeśli jest za duży, więc możemy zobaczyć jego strukturę. –

+1

Nie należy bezpośrednio używać XmlTextReader. Zamiast tego użyj 'XmlReader.Create()'. –

Odpowiedz

3

Prawdopodobnie brakuje IsStartElement() warunek w pętli while:

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

Ponadto, byłoby łatwiej użyj XPath lub LINQ to XML, aby odczytać swój XML, oczywiście zależy to od pliku. Oto kilka przykładów: XPath i LINQ.

EDIT: po obejrzeniu szczegóły pliku XML

Należy zaktualizować swoją logikę śledzić aktualną student i jego testscores. Zauważ też, że atrybutem jest count. Wkrótce może stać się niechlujny, sugeruję, żebyś spojrzał na próbki wspomniane powyżej.

+3

Zgadzam się, że powinieneś używać LINQ do XML (klasa XElement), chyba że masz ku temu dobry powód - jedyny dobry powód, dla którego jestem świadomy, to to, że twój dokument jest zbyt duży, aby wsypać go do pamięci jednocześnie. – Mason

1

Myślę, że można uzyskać najlepsze wyniki przy użyciu 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

Powodem jej nie działa, bo na przykład: gdy reader.Name == „Imię” jest prawdziwe, ale to nie jest prawda, ze jego wartości elementów. Co to dokładnie znaczy, że obiekt czytnika odczytuje następny Nodetype, który jest XmlNodeType.Element. Tak więc w tym przypadku patrząc na twój plik XML, używając read.Read(); funkcja ponownie odczytuje następny węzeł, którym jest XmlNodeType.Text, a jego wartość to Joe. Podaję przykład działającej wersji.

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

    } 
} 

}