2012-05-23 11 views
5

De este código XML:¿Cómo obtengo el valor de un nodo específico en un archivo 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> 

¿Cómo puedo conseguir (por ejemplo) el 10 junto a <Kills>?

He intentado varias cosas sin éxito. Una de las ideas que tenía estaba utilizando este código:

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 

Pero no puedo encontrar la manera de editar fragmento que trabajar con lo que se necesita hacer ahora.

(El código anterior funciona perfectamente para donde se utiliza.)

+0

League of Legends, o Hamlet? – JWiley

+0

Battlefield 3 en realidad :) – Yorrick

Respuesta

9

También puede utilizar XPath para leer el valor del elemento:

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

Sin embargo, si usted tiene la intención de cargar y utilizar toda la datos, sería mucho más fácil utilizar la serialización. Para ello, primero tiene que crear clases que imitan la estructura XML (por razones de simplicidad sólo voy a utilizar campos de cadenas públicas, pero sería mejor utilizar propiedades):

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 

A continuación, deserializar el XML como esto:

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, gracias :) – Yorrick

+0

@Yorrick Actualicé mi respuesta con otra opción mediante serialización. –

+0

Serialización como poner todo en una fila? No estoy muy seguro de lo que quieres decir exactamente. Dicho esto, el primer método funciona perfectamente y rápido. No es como si tuviera miles de '. 'nodos, solo como 20-ish al final. – Yorrick

2

XPath o un XmlDeserialization recomendado por Steve son excelentes opciones, pero para una solución pura LINQ, sólo tiene que añadir una cláusula apropiada Where a su consulta.

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 seguirá siendo un IEnumerable<String> en este ejemplo, por lo que si sólo tiene 1 objeto, es necesario hacer algo como:

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 

(Mi vb .NET está extremadamente oxidado, así que, por favor, perdona cualquier error de sintaxis).

Cuestiones relacionadas