【问题标题】:Xml node value from an attribute in VB.net来自 VB.net 中属性的 XML 节点值
【发布时间】:2013-01-22 17:09:47
【问题描述】:
我有一个类似的 XML
<Categories>
<category name="a">
<SubCategory>1</SubCategory>
<SubCategoryName>name1</SubCategoryName>
</category>
<category name="b">
<SubCategory>2</SubCategory>
<SubCategoryName>name2</SubCategoryName>
</category>
</Categories>
如何从<category name="a"> 获取<SubCategoryName> 的值?
【问题讨论】:
标签:
xml
vb.net
xmlnode
xml-attribute
【解决方案1】:
简单点怎么样
Dim xml = <Categories>
<category name="a">
<SubCategory>1</SubCategory>
<SubCategoryName>name1</SubCategoryName>
</category>
<category name="b">
<SubCategory>2</SubCategory>
<SubCategoryName>name2</SubCategoryName>
</category>
</Categories>
Dim result = xml.<category> _
.First(Function(e) e.Attribute("name") = "a") _
.<SubCategoryName>.Value
result 现在是name1。
【解决方案2】:
你可以把它当作
Dim doc As XDocument = XDocument.Load("YourXMLFileName")
Dim query = From d In doc.Descendants("Categories").Elements("category")
Where d.Attribute("name").Value = "a"
Select d.Element("SubCategoryName").Value
【解决方案3】:
你可以这样做:
Dim aux As New Xml.XmlDocument()
Dim nodeLst As Xml.XmlNodeList
Dim sResult As String = String.Empty
aux.Load(sXmlFilePath)
nodeLst = aux.GetElementsByTagName("category")
For Each cat As Xml.XmlElement In nodeLst
If cat.GetAttribute("name") = "a" Then
sResult = cat("SubCategoryName").Value
Exit For
End If
Next
【解决方案4】:
按照 Usman 的建议,您可以使用 LINQ,但另一个流行的选择是使用 XPath。您可以使用 XPath 来选择使用 XDocument 类或较旧的 XmlDocument 类的匹配元素。
以下是通过 XDocument 类使用 XPath 的方法:
Dim doc As New XDocument()
doc.Load(filePath)
Dim name As String = doc.XPathSelectElement("/Categories/category[@name='a']/SubCategoryName").Value
下面是通过 XmlDocument 类使用 XPath 的方法:
Dim doc As New XmlDocument()
doc.Load(filePath)
Dim name As String = doc.SelectSingleNode("/Categories/category[@name='a']/SubCategoryName").InnerText
XPath 各部分的含义如下:
-
/Categories - 开头的斜线指示它查看 XML 文档的根目录。斜线后面是我们在根中查找的子元素的名称。
-
/category - 我们在 /Categories 元素中查找的元素的名称。
-
[@name='a'] - 方括号表示它是一个条件类和 If 语句,有点像。 @ 符号表示我们正在指定一个属性名称(而不是元素名称)。
-
/SubCategoryName - 我们在 category 元素中寻找的与该条件匹配的子元素的名称。
XPath 非常强大和灵活。 XPath 是一种标准查询语言,许多 XML 工具和技术(例如 XSLT)都在使用它,因此学习它非常有用。此外,有时,即使在文档中,能够通过简单的字符串专门引用文档中的特定 XML 节点也很方便。 LINQ 很棒,但它是一项专有的 Microsoft 技术,如果需要,您不能将 LINQ 路径作为字符串存储在数据库或配置文件中,因此有时 XPath 是一种可取的方法。
XPath 的另一个变体是//category[@name='a']/SubCategoryName。开头的双斜杠指示它在文档中的任何位置查找类别元素,而不是在任何特定的父元素下。
【解决方案5】:
代码可以代替
sResult = cat("SubCategoryName").Value
使用
sResult = cat("SubCategoryName").InnerText