Вопрос по vb.net, linq, xml – Как получить значение из определенного узла в файле XML?

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

Я пробовал несколько вещей, но безуспешно. Одной из идей, которые у меня были, было использование этого кода:

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

Но я не могу понять, как отредактировать этот фрагмент для работы с тем, что мне нужно сделать сейчас.

(Приведенный выше код отлично работает там, где он используется.)

Battlefield 3 на самом деле :) Yorrick
Лига Легенд или Гамлет? JWiley

Ваш Ответ

2   ответа
3

XPath или жеXmlDeserialization рекомендуемые Стивом отличные варианты, но для чистого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 очень ржавый, поэтому, пожалуйста, простите за любые синтаксические ошибки).

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
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded<Member>.</Member>Error: User Rate Limit Exceeded Yorrick
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Yorrick
Error: User Rate Limit Exceeded

Похожие вопросы