2012-04-14 14 views
5

C# ve web servisleriyle başlayan yeni başlayan bir programcıyım. Benim web hizmetinin Service.cs dosyasında XmlTextReader'ı Kullanma

, ben, varolan XML dosyasını okumak ondan verileri alıp ben IService.cs oluşturulan karşılık gelen özellikleri (DataMembers) bunu yerleştirmek için çalışıyorum bir ReadXMLFile() yöntemi oluşturmak dosya.

Sorunum, kodumun temel olarak hiçbir şey yapmamasıdır. Bu konuda web siteleri ve öğreticiler aramayı denedim, ancak özellikle kendim gibi yeni başlayanlar için orada pek bir şey yok. Bunun hakkında nasıl düşünmem gerektiğine dair herhangi bir fikri olan var, çünkü şu ana kadar denediğim şey açıkça yanlış.

Benim ReadXMLFile() yöntemim.

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

bu

benim xml dosyasından bir örnektir

<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

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

} (http://stackoverflow.com/q/55828/1048330) – tenorsax

+0

kullanışlı Eğer xml dosyası veya bir örneğini paylaşmalıdır eğer çok büyükse, onun yapısını görebiliriz. –

+1

XmlTextReader'ı doğrudan kullanmamalısınız. Bunun yerine 'XmlReader.Create()' kullanın. –

cevap

3

Muhtemelen süre döngüde IsStartElement() koşulunu eksik: Ayrıca

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

, bu daha kolay olurdu XML'inizi okumak için XPath veya LINQ to XML kullanın, tabiki dosyaya göre değişir. İşte bazı örnekler: XPath ve LINQ.

DÜZENLEME: XML dosyası ayrıntıları

gördükten sonra Geçerli student ve testscores izlemek için mantık güncellemeniz gerekir. Ayrıca, count'un bir özellik olduğunu unutmayın. Çok yakında dağınık olabilir, yukarıda belirtilen örneklere göz atmanızı öneririm.

+3

LINQ'i XML (XElement sınıfı) için iyi bir nedeniniz olmadıkça kullanmamanızı kabul ediyorum - farkında olduğum tek iyi sebep, belgenizin bir kerede belleğe tamamını dağıtamayacak kadar büyük olmasıdır. – Mason

1

Sana 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

nedeni kullanarak en iyi sonucu almak olduğunu düşünmek, onun çalışmıyor, çünkü örnek: reader.Name == "ad" doğrudur ama onun unsurları değeri ile gerçek değilken. Tam olarak anlamı, okuyucu nesnenin XmlNodeType.Element olan bir sonraki Nodetype'ı okumasıdır. Bu durumda, XML dosyanıza bakarak, reader.Read() öğesini kullanarak; işlevi tekrar XmlNodeType.Text olan bir sonraki düğümü okur ve değeri daha sonra Joe'dur. Size çalışma sürümü örneği verdim. Bunu [xml dosyaları ayrıştırmak için en iyi uygulamalar] bulabilir