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

問題はXML要素名にはありません(編集に無効なXMLが含まれていますが、開始タグのみを変更し、終了タグは変更していません)。

問題は、ロードしたXMLドキュメントの子要素(この場合はすべての製品タグとその子)<Version>が製品に含まれていることです。<Products>....</Products>

あなたがしたいのは、すべての<name>ノードのコレクションを取得することです。これは、次の2つの方法のいずれかで実行できます。

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

出力は次のようになります

製品1
製品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 に答える
2

問題は、NameにロードしたXMLドキュメントの子要素(この場合はすべてのnameタグとその子)<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

「Tel」でも同じことができます

完全なコード:

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 に答える
0

product.Elements("name")returnIEnumerable<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 に答える