7

Web サービスから XML を取得しました。「DOMDocument」として宣言しました。これは私の XML です。ここで、「ZIP」という名前のすべての属性を読み取りたいと考えています。

<?xml version="1.0" encoding="utf-8" ?> 
<Location>
  <Cities>
   <City ZIP="8355">Aadorf</City> 
   <City ZIP="5000">Aarau</City> 
   <City ZIP="5004">Aarau</City> 
   <City ZIP="5032">Aarau Rohr</City> 
   <City ZIP="3270">Aarberg</City> 
   <City ZIP="4663">Aarburg</City> 
   <City ZIP="4912">Aarwangen</City> 
   <City ZIP="8607">Aathal-Seegräben</City> 
   <City ZIP="8522">Aawangen</City> 
   <City ZIP="1657">Abländschen</City> 
   <City ZIP="5646">Abtwil AG</City> 
   <City ZIP="9030">Abtwil SG</City> 
  </Cities>
<Location>

と...

Private Sub Workbook_Open()

    Dim i As Integer
    Dim NumberOfElements As Integer
    Dim City As String
    Dim xmlUrl As String
    Dim xmlDoc As New DOMDocument

    xmlUrl = "http://localhost:62231/dataHandling.asmx/GetAllCities"
    xmlDoc.async = False

    If xmlDoc.Load(xmlUrl) = False Then
        MsgBox ("XML LOAD ERROR")
    Else

        NumberOfElements = xmlDoc.getElementsByTagName("City").Length

        For i = 0 To NumberOfElements - 1

            City = xmlDoc.SelectSingleNode("//Cities/City").Attributes.getNamedItem("ZIP").Text

            City = City & " " & xmlDoc.getElementsByTagName("City").Item(i).Text

            Tabelle2.Cells(i + 3, 1).Value = City

        Next i

    End If

End Sub

要素「都市」からすべてのインナーテキストを取得します。しかし、毎回同じ属性「8355」。

City = xmlDoc.SelectSingleNode("//Cities/City").Attributes.getNamedItem("ZIP").Text

この行は異なるはずですが、XML 全体をループしてすべての属性を読み取る方法がわかりません。

4

1 に答える 1

10

xmlDoc.SelectSingleNode("//Cities/City")常に最初のノードを選択します。毎回魔法のように次のノードを選択することはできません。そのためには、ユーザーの心を読まなければなりません。

Private Sub Workbook_Open()
  Dim City As String
  Dim xmlUrl As String
  Dim xmlDoc As New DOMDocument
  Dim n As IXMLDOMNode
  Dim i As Long

  xmlUrl = "http://localhost:62231/dataHandling.asmx/GetAllCities"
  xmlDoc.async = False

  If Not xmlDoc.Load(xmlUrl) Then
    MsgBox "XML LOAD ERROR"
  Else

    For Each n In xmlDoc.selectNodes("//Cities/City")
      City = n.Attributes.getNamedItem("ZIP").Text

      City = City & " " & n.Text

      Tabelle2.Cells(i + 3, 1).Value = City
      i = i + 1
    Next

  End If

End Sub
于 2013-05-14T08:49:02.590 に答える