如何从 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
How do I get the value from a specific node in an XML file?
提问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 非常生疏,所以请原谅任何语法错误)。

