从xml字符串中读取特定元素?

时间:2014-08-23 08:50:00

标签: .net xml vb.net winforms

我有一个xml字符串存储在数据库中

 <?xml version="1.0" encoding="utf-16" standalone="yes"?>
<Table>
  <Product>
    <Product_id>1</Product_id>
    <Product_name>Product 1</Product_name>
    <Product_price>1000</Product_price>
  </Product>
  <Product>
    <Product_id>2</Product_id>
    <Product_name>Product 2</Product_name>
    <Product_price>2000</Product_price>
  </Product>
  <Product>
    <Product_id>3</Product_id>
    <Product_name>Product 3</Product_name>
    <Product_price>3000</Product_price>
  </Product>
  <Product>
    <Product_id>4</Product_id>
    <Product_name>Product 4</Product_name>
    <Product_price>4000</Product_price>
  </Product>
</Table>

  Dim reader As XmlReader = XmlReader.Create(New StringReader(xmlstring)) 

其中xmlstring是String包含上面的xml数据。  如何直接读取ID为4的产品?

2 个答案:

答案 0 :(得分:3)

您可以使用XDocumentXDocument.Parse()方法轻松完成此操作,而无需手动遍历XML元素:

Dim doc = XDocument.Parse("your xml string here")
Dim product = doc.Root _
                 .Elements("Product") _
                 .FirstOrDefault(Function(x) x.Element("Product_id").Value = "4")
'at this point, product contain the desired <Product> element'
'you can get product name this way :'
Dim productName = product.Element("Product_name").Value

更新:

由于.NET 2.0中不提供XDocument,因此我们必须迁移到较早的XmlDocument。对于那些熟悉XPath的人来说,这甚至可以更简单:

Dim doc As XmlDocument = New XmlDocument()
doc.LoadXml(xmlstring)

Dim productName = doc.SelectSingleNode("/Table/Product[Product_id='4']/Product_name") _
                     .InnerText

上面示例中使用的XPath意味着,搜索具有子节点<Product>的{​​{1}}节点等于4,然后从<Product_id>获取<Product>子节点

答案 1 :(得分:2)

如果您没有使用循环,那么我认为最好使用XmlDocument类。用LINQ来解决这个问题,问题就解决了。

Dim document As XmlDocument = New XmlDocument()

document.LoadXml(xmlstring)

Dim match As XmlNode = (
    From
        node As XmlNode
    In
        document.SelectNodes("/Table/Product").Cast(Of XmlNode)()
    Where
        node.SelectNodes("Product_id")(0).InnerText = "4"
    Select
        node
).FirstOrDefault()

If (match Is Nothing) Then
    'No match
Else
    'Found
End If

.Net 2.0

使用For Each循环:

Dim document As XmlDocument = New XmlDocument()

document.LoadXml(xmlstring)

Dim match As XmlNode = Nothing

For Each node As XmlNode In document.SelectNodes("/Table/Product")
    If (node.SelectNodes("Product_id")(0).InnerText = "4") Then
        match = node
        Exit For
    End If
Next

If (match Is Nothing) Then
    'No match
Else
    'Found
End If