【问题标题】:How do I get the value from a specific node in an XML file?如何从 XML 文件中的特定节点获取值?
【发布时间】:2012-05-30 08:21:30
【问题描述】:

从此 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>

如何获得(例如)&lt;Kills&gt; 旁边的 10?

我尝试了多种方法,但均未成功。 我的想法之一是使用此代码:

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

但我不知道如何编辑该 sn-p 来处理我现在需要它做的事情。

(上面的代码非常适合使用它。)

【问题讨论】:

  • 英雄联盟还是哈姆雷特?

标签: xml vb.net linq xpath xml-serialization


【解决方案1】:

您也可以使用 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

【讨论】:

  • @Yorrick 我用序列化的另一个选项更新了我的答案。
  • 序列化就像把它全部放入 1 行?我不太确定你的意思是什么。话虽如此,第一种方法完美而快速。我不会有成千上万个&lt;Member&gt;.&lt;/Member&gt; 节点,最终只有 20 个左右。
  • @Yorrick 序列化使您可以轻松地将对象保存到 XML 文档中。默认情况下,对象的所有属性在 XML 中都表示为子元素。您可以使用属性进一步自定义序列化程序格式化 XML 的方式。方便的是,您还可以将 XML 反序列化回对象。所以,如果你有一些 XML 需要阅读,你可以创建一个镜像 XML 结构的类,然后反序列化成它。
  • @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&lt;String&gt;,因此如果您只有 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 非常生锈,所以请原谅任何语法错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    • 2018-07-30
    相关资源
    最近更新 更多