2012-05-23 20 views
5

:Değeri, bir XML dosyasındaki belirli bir düğümden nasıl alırım? bu XML kodu itibaren

<?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> 

nasıl (örneğin) 10 sonraki <Kills> alabilirim?

Birden çok şeyi sorunsuz olarak denedim. Bu kodu kullanarak vardı fikirlerin biri:

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 

Ama şimdi yapmak gerek şeyle çalışmak o parçacığını nasıl düzenleneceği bilemiyorum.

(yukarıdaki kod kullanıldığı nereye için mükemmel çalışıyor.) Ayrıca elementin değerini okumak için XPath kullanabilirsiniz

+0

League of Legends veya Hamlet? – JWiley

+0

Battlefield 3 aslında :) – Yorrick

cevap

9

: Ancak, yük ve kullanmayı düşünüyorsanız

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

tüm veri, serileştirme kullanmak çok daha kolay olurdu. Bunu yapmak için, önce ihtiyaç XML yapısını taklit sınıfları oluşturmak için (basitlik uğruna ben sadece kamu dize alanlarını kullanacağız, ancak özelliklerini kullanmak daha iyi olurdu):

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 

Sonra gibi XML serisini Bu:

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, teşekkürler :) – Yorrick

+0

@Yorrick Yanıtımı serileştirme kullanarak başka bir seçenekle güncelledim. –

+0

Seri hale getirme, herşeyi 1 sıraya koymadaki gibi mi? Tam olarak ne demek istediğine emin değilim. Bu söylenen, ilk yöntem mükemmel ve hızlı çalışır. Binlerce 'um olacak gibi değil. 'düğümleri, yalnızca 20-ish gibi. – Yorrick

2

XPath veya XmlDeserialization Steve tarafından önerilen bir mükemmel seçeneklerdir ama saf LINQ çözüm için, sadece sorguya uygun Where madde eklemek gerekir.

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 sadece 1 nesne varsa, böyle bir şey yapmak gerekir böylece yine, bu örnekte bir IEnumerable<String> olacak:

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

veya

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

(My fi .NET çok paslıdır, bu yüzden lütfen herhangi bir sözdizimi hatası affedin).

İlgili konular