2012-05-23 2 views
5

Da questo codice XML:Come si ottiene il valore da un nodo specifico in un file XML?

<?xml version="1.0" encoding="utf-8"?> 
<Tabel> 
    <Member> 
    <Naam>Cruciatum</Naam> 
    <Kills>1000</Kills> 
    <Deaths>10</Deaths> 
    <KD>100</KD> 
    </Member> 
    <Member> 
    <Naam>Ghostbullet93</Naam> 
    <Kills>10</Kills> 
    <Deaths>1</Deaths> 
    <KD>10</KD> 
    </Member> 
</Tabel> 

Come posso ottenere (per esempio) il 10 accanto al <Kills>?

Ho provato più cose senza alcun successo. Una delle idee che avevo era utilizzando questo codice:

Dim doc = XDocument.Load("C:\members.xml") 
     Dim members = From m In doc.Element("Tabel").Elements("Member") 
         Select naam = m.Element("Naam").Value 
     For Each member In members 
      lstmembers.Items.Add(member) 
     Next 

Ma io non riesco a capire come modificare quel frammento di lavorare con quello che ho bisogno di fare adesso.

(Il codice precedente funziona perfettamente per cui viene utilizzato.)

+0

League of Legends o Hamlet? – JWiley

+0

Battlefield 3 in realtà :) – Yorrick

risposta

9

È possibile anche usare XPath per leggere il valore dell'elemento:

Dim doc As XmlDocument = New XmlDocument() 
doc.Load("C:\members.xml") 
Dim kills As String = doc.SelectNode("Tabel/Member[Naam='Ghostbullet93']/Kills").InnerText 

Se, invece, avete intenzione di caricare e utilizzare tutte le dati, sarebbe molto più facile usare la serializzazione. Per fare questo, è necessario prima creare classi che imitano la struttura XML (per semplicità mi limiterò a usare i campi stringa pubblici, ma sarebbe meglio usare le proprietà):

Public Class Member 
    Public Naam As String 
    Public Kills As Integer 
    Public Deaths As Integer 
    Public KD As Integer 
End Class 

Public Class Tabel 
    <XmlElement("Member")> _ 
    Public Members As List(Of Member) 
End Class 

Poi deserializzare il XML come questo:

Dim serializer As XmlSerializer = New XmlSerializer(GetType(Tabel)) 
Dim tabel As Tabel = CType(serializer.Deserialize(File.OpenRead("C:\members.xml")), Tabel) 
For Each member As Member in tabel 
    Dim kills As Integer = member.Kills 
Next 
+0

Purrrr-fect, grazie :) – Yorrick

+0

@Yorrick Ho aggiornato la mia risposta con un'altra opzione utilizzando la serializzazione. –

+0

Serializzazione come nel mettere tutto in 1 riga? Non sono abbastanza sicuro di cosa intendi esattamente. Detto questo, il primo metodo funziona perfettamente e rapidamente. Non è che avrò migliaia di '. 'nodi, solo come 20-ish alla fine. – Yorrick

2

XPath o XmlDeserialization una raccomandata da Steve sono eccellenti opzioni, ma per una soluzione di pura LINQ, basta aggiungere un adeguato Where clausola alla tua richiesta.

Dim doc = XDocument.Load("C:\members.xml") 
Dim members = From m In doc.Element("Tabel").Elements("Member") 
       Where m.Element("Naam").Value = "Ghostbullet93" 
       Select kills = m.Element("Kills").Value 

members sarà ancora una IEnumerable<String> in questo esempio, quindi se avete solo 1 oggetto, è necessario fare qualcosa di simile:

Dim member = members.First() // will throw exception if collection is empty 

o

Dim member = members.Single() // will throw exception if collection is empty or has 2 or more elements 

(My vb .NET è estremamente arrugginito, quindi ti preghiamo di perdonare eventuali errori di sintassi).