2012-05-23 5 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

XPathまたはXmlDeserializationスティーブが推奨する、優れた選択肢ですが、純粋なLINQ解決のために、あなたは自分のクエリに適切なWhere句を追加する必要があります。

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:あなただけ1つのオブジェクトを持っているので、もし

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>だろう、あなたのような何かをする必要があり.NETは非常に錆びているので、何か構文エラーを許してください)。