6

この 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>ですか?

私は成功せずに複数のことを試しました。私が持っていたアイデアの1つは、次のコードを使用することでした:

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

しかし、そのスニペットを編集して、今必要なことを処理する方法がわかりません。

(上記のコードは、使用されている場所で完全に機能します。)

4

2 に答える 2

10

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
于 2012-05-23T18:37:12.527 に答える
3

XPathまたはXmlDeserializationSteveが推奨するオプションは優れたオプションですが、純粋なソリューションの場合は、クエリに適切な句を 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は非常に錆びているので、構文エラーはご容赦ください)。

于 2012-05-23T18:49:57.930 に答える