如何从 XML 文件中的特定节点获取值?

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10725820/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-09-06 13:29:33  来源:igfitidea点击:

How do I get the value from a specific node in an XML file?

xmlvb.netlinqxpathxml-serialization

提问by Yorrick

From this XML code:

从这个 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>

How can I get (for example) the 10 next to <Kills>?

我怎样才能得到(例如)旁边的 10 <Kills>

I've tried multiple things without any success. One of the ideas I had was using this code:

我尝试了很多事情都没有成功。我的想法之一是使用此代码:

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

But I can't figure out how to edit that snippet to work with what I need it to do now.

但我不知道如何编辑该片段以处理我现在需要它做什么。

(The above code works perfectly for where it's used.)

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

回答by Steven Doggart

You can also use XPath to read the element's value:

您还可以使用 XPath 读取元素的值:

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

If, however, you intend to load and use all the data, it would be far easier to use serialization. To do that, you first need to create classes that mimic the XML structure (for simplicity sake I'll just use public string fields, but it would be better to use properties):

但是,如果您打算加载和使用所有数据,则使用序列化会容易得多。为此,您首先需要创建模仿 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

Then deserialize the XML like this:

然后像这样反序列化 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

回答by psubsee2003

XPathor XmlDeserializationa recommended by Steve are excellent options, but for a pure LINQsolution, you just need to add an appropriate Whereclause to your query.

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

memberswill still be an IEnumerable<String>in this example, so if you only have 1 object, you need to do something like:

membersIEnumerable<String>在此示例中仍将是 an ,因此如果您只有 1 个对象,则需要执行以下操作:

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

or

或者

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

(My vb.NET is extremely rusty, so please forgive any syntax errors).

(我的 vb.NET 非常生疏,所以请原谅任何语法错误)。