2012-05-23 176 views
5

從這個XML代碼:如何從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> 

如何,我可以得到(比如說)10旁邊<Kills>

我試過多件事沒有任何成功。 其中一個想法我已經在使用此代碼:

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 

但我無法弄清楚如何編輯片段用什麼,我需要它現在要做的工作。

(上面的代碼完全適用於它使用的地方。)

+0

英雄聯盟或哈姆雷特? – JWiley

+0

戰地3實際上:) – Yorrick

回答

9

您還可以使用XPath來讀元素的值:

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

但是,如果你打算加載並使用所有數據,使用序列化會容易得多。要做到這一點,首先需要創建一個模擬XML結構類(簡單起見,我將只使用公共字符串字段,但它會更好地使用性質):

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 

然後反序列化,如XML這樣的:

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

+0

@Yorrick我更新了我的答案與另一個選擇使用序列化。 –

+0

序列化,把它放在1行?我不完全確定你的意思。話雖如此,第一種方法完美而快捷。這不像我會有成千上萬的''節點,最終只有20-ish。 – Yorrick

2

XPathXmlDeserialization一個由史蒂夫·推薦的是不錯的選擇,但對於一個純LINQ解決方案,您只需要一個合適的Where條款添加到您的查詢。

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依然會在本例中IEnumerable<String>,所以如果你只有1個對象,你需要做的是這樣的:

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

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

(我的VB .NET非常生疏,所以請原諒任何語法錯誤)。