2010-02-15 11 views
7

Mam googled przez ostatnią godzinę lub tak bez powodzenia (chciałbym myśleć, że jestem świetnym googlerem!), Więc jestem tutaj.Czytaj XML w VB.net

Mam plik XML, który używam do moich ustawień programów, wygląda tak:

<?xml version="1.0" encoding="utf-8"?> 
<config> 
    <store> 
     <number>0323</number> 
     <address>address</address> 
     <phone>phone</phone> 
    </store> 

    <emailsettings> 
     <emailfrom>emailfrom</emailfrom> 
     <emailpass>pass</emailpass> 
     <emailsubject>received</emailsubject> 
     <smtpserver>smtp.gmail.com</smtpserver> 
     <smtpport>587</smtpport> 
     <enablessl>true</enablessl> 
     <emailbody>package received</emailbody> 
    </emailsettings> 
    <dbconfig> 
     <dbpath>path</dbpath> 
    </dbconfig> 
</config> 

Jak mogę używać vb.net aby każdy element i zwraca szczególną wartość, którą chcę ? Per se, chciałbym zwrócić <number> (pod <store>) w polu tekstowym 1 i <emailbody> (pod <emailsettings>) w polu tekstowym2.

Pomoc pleaseeeeee! Dzięki :)

Odpowiedz

18

Ach, to doskonały przykład na pokaz potężne funkcje XML VB.NET z Framework 3.5:

Sub Main() 
    Dim xml = XDocument.Load("config.xml") 
    Console.WriteLine("Number: " & xml.<config>.<store>.<number>.Value) 
    Console.WriteLine("Body: " & xml.<config>.<emailsettings>.<emailbody>.Value) 
End Sub 

wydajność:

Number: 0323 
Body: package received 
+1

To jest świetna odpowiedź, WAY lepiej niż moja odpowiedź na serializację. Twoja odpowiedź jest tym, czego szukałem na moje pytanie: http://stackoverflow.com/questions/2253900/generics-and-duck-typing-xml-in-net Proszę dodaj tę odpowiedź do mojego pytania i przyjmuję. – Achilles

+0

Splendid, ale co jeśli masz wiele numerów innego sklepu, ponieważ plik może być jednym plikiem konfiguracji dla wielu sklepów? –

+0

@AhmedNazmy: 'Dla każdego sklepu w formacie xml. . '. Następnie wewnątrz pętli otwórz 'store. . Wartość ". – Heinzi

1

Można użyć szeregowania XML. Utwórz klasy reprezentujące twoją strukturę XML i użyj klasy Serialization XML do deserializacji danych. Kiedy już to zrobisz, możesz użyć danych w swojej aplikacji.

Poniżej znajduje się link do przykładu z MSDN:

http://msdn.microsoft.com/en-us/library/ms950721.aspx

+0

+1. Używam go przez cały czas, kiedy mam do odczytu/zapisu XML, który mam pod kontrolą. – OregonGhost

5

Oto app konsoli przy użyciu dosłownym wsparcia VB.Net XML.

Module Module1 

    Sub Main() 

     Dim xElem = <config> 
         <store> 
          <number>0323</number> 
          <address>address</address> 
          <phone>phone</phone> 
         </store> 

         <emailsettings> 
          <emailfrom>emailfrom</emailfrom> 
          <emailpass>pass</emailpass> 
          <emailsubject>received</emailsubject> 
          <smtpserver>smtp.gmail.com</smtpserver> 
          <smtpport>587</smtpport> 
          <enablessl>true</enablessl> 
          <emailbody>package received</emailbody> 
         </emailsettings> 
         <dbconfig> 
          <dbpath>path</dbpath> 
         </dbconfig> 
        </config> 

     Dim number = xElem.<store>.<number>.Value 
     Dim emailbody = xElem.<emailsettings>.<emailbody>.Value 

     Console.WriteLine(String.Format("Number={0}", number)) 
     Console.WriteLine(String.Format("emailbody={0}", emailbody)) 
     Console.ReadLine() 

     '--- What it'd look like if you loaded from a file using XDocument.Load 
     Dim xDoc = XDocument.Load(New IO.StringReader(xElem.ToString)) 
     number = xDoc.Root.<store>.<number>.Value 
     emailbody = xDoc.Root.<emailsettings>.<emailbody>.Value 

     Console.WriteLine(String.Format("Number={0}", number)) 
     Console.WriteLine(String.Format("emailbody={0}", emailbody)) 
     Console.ReadLine() 


    End Sub 

End Module 

Wyniki będą:

Number=0323 
emailbody=package received 

Number=0323 
emailbody=package received 
+0

+1, ponieważ nie rozumiem spadku ... – Heinzi

+0

Dzięki za +1. :-) – Rick

+0

+1 za skorzystanie z niesamowitych funkcji językowych – Jay

0

Jeśli jesteś zaznajomiony z zestawów danych i DataTables, jest to prosty sposób, aby to zrobić:

Dim DS As New DataSet 
DS.ReadXml("Data.xml") 

DataSets może odczytać dowolny kod XML. Używam tego nawet do wywoływania usług XML z obsługą rest.