2

我有以下 XML

     <xml>
         <version>1.0</version>
         <products>
              <product>
                    <name>Product 1</ProductName>
                    <id>1</ProductId>
              </product>
              <product>
                    <name>Product 2</ProductName>
                    <id>2</ProductId>
              </product>
              <product>
                    <name>Product 3</ProductName>
                    <id>3</ProductId>
              </product>
          </products>
      </xml>

我有以下代码用于循环产品

   Dim xelement As XElement = xelement.Load("aaa.xml")
   Dim products As IEnumerable(Of XElement) = xelement.Elements()
       For Each product In products
           Console.WriteLine(product.Elements("name").Value)
       Next product

product.Elements("name").Value给出错误。我在这里做错了什么?

4

3 回答 3

2

问题是 Name 包含您加载的 XML 文档的子元素 - 在本例中,<Version>以及<name>....</name>(即所有名称标签及其子元素)。

您想要做的是获取所有<Name>节点和<tel>节点的集合,您可以这样做:

 Dim Names As IEnumerable(Of XElement) = xelement.Descendants("Name")

  For Each Name As XElement In Names 
        MsgBox((Name.Value)
  Next

你可以为“电话”做同样的事情

完整代码:

Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click

    Dim cbFileName As String = "<xml><version>1.0</version><name>A1</name><tel>12</tel><name>A2</name><tel>21</tel><name>A3</name><tel>11</tel></xml>"

    Dim xelement As XElement = xelement.Load(cbFileName.Text)

    Dim products As IEnumerable(Of XElement) = xelement.Descendants("name")

    For Each product As XElement In products
        MessageBox.Show(product.Value)
    Next

    Dim Telephone As IEnumerable(Of XElement) = xelement.Descendants("tel")

    For Each telep As XElement In Telephone
        MessageBox.Show(telep.Value)
    Next

End Sub

输出:

A1 A2 A3

12 21 11

于 2014-01-22T10:52:40.767 回答
2

问题不在于 XML 元素名称(尽管您的编辑包含无效的 XML - 您只更改了开始标记,而不是结束标记)。

问题是 products 包含您加载的 XML 文档的子元素 - 在这种情况下,<Version>以及<Products>....</Products>(即所有产品标签及其子元素)。

您想要做的是获取所有<name>节点的集合,您可以通过以下两种方式之一执行此操作:

Dim products As IEnumerable(Of XElement) = xelement.Element("products").Element("product").Element("name")

或者

Dim products As IEnumerable(Of XElement) = xelement.Descendants("name")

然后,在您的 中For Each,只需调用ValueProduct如下所示:

For Each product As XElement In products
    Console.WriteLine(product.Value)
Next

输出将是

产品一
产品 2
产品 3

编辑添加完整代码

Imports System.Xml.Linq
Imports System.Collections.Generic

Module Module1

    Sub Main()

        Dim Xml As String = "<xml><version>1.0</version><products><product><name>Product 1</name><id>1</id></product><product><name>Product 2</name><id>2</id></product><product><name>Product 3</name><id>3</id></product></products></xml>"

        Dim xelement As XElement = xelement.Parse(Xml)

        Dim products As IEnumerable(Of XElement) = xelement.Descendants("name")

        For Each product As XElement In products
            Console.WriteLine(product.Value)
        Next

        Console.ReadLine()
    End Sub

End Module
于 2013-03-03T02:34:54.710 回答
0

product.Elements("name")return IEnumerable<XElement>,所以它没有.Value属性。试试这个:

Dim products As IEnumerable(Of XElement) = xelement.Elements()
For Each product In products
    Console.WriteLine(product.Element("name").Value)
Next product
于 2013-03-03T19:15:37.460 回答