10

URL API からの XML ファイルがあります (URL は、安全な情報へのアクセスを許可するため、共有していません)。このファイルから、特定の情報を取得したいと考えています。私の問題は、親ノード (eventNode) にいると、特定の子ノードからデータを取得できるようにしたいということです。

たとえば、eventNode がである場合、ノード名(または、取得したいその他の値) を知っているだけ<event><ID>1</ID>...<title>event 1</title></event>でどのように取得できますか?1ID

私はフォーラムをよく見ましたが、.SelectSingleNodeうまくいきませんでした。また.selectNodes、XML 文字列内のノードの通常のリストのようには機能しません。これが、XML ファイルの解析に使用している方法によるものかどうかはわかりません。

Sub ListEvents()

Dim strPath As String

strPath = getAPI("GetEvents", "filter=&orderBy=")

Dim xmlDocument As MSXML2.DOMDocument60
Set xmlDocument = New DOMDocument60

With CreateObject("MSXML2.XMLHTTP")
    .Open "GET", strPath, False
    .send
    xmlDocument.LoadXML .responseText
End With

Dim lvl1 As IXMLDOMNode: Dim lvl2 As IXMLDOMNode
Dim eventNode As IXMLDOMNode: Dim isNode As IXMLDOMNode

For Each lvl1 In xmlDocument.ChildNodes
    For Each lvl2 In lvl1.ChildNodes
        For Each eventNode In lvl2.ChildNodes
            If eventNode.HasChildNodes Then
                'Here is where I want code to find specific child node
                'without having to look at every node.
            End If
        Next
    Next
Next

End Sub

サンプル XML:

<?xml version="1.0" encoding="utf-8" ?> 
<ResultsOfListOfEvent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://www.regonline.com/api">
  <Success>true</Success> 
  <Data>
    <APIEvent>
      <ID>111</ID> 
      <CustomerID>222</CustomerID> 
      <ParentID>0</ParentID> 
      <Status>Testing</Status> 
      <Title>Event Name</Title> 
      <ClientEventID /> 
      <TypeID>9</TypeID> 
      <TimeZone>GMT</TimeZone> 
      <CurrencyCode>GBP</CurrencyCode> 
      <AddDate>2013-12-18T02:34:09.357</AddDate> 
      <Channel>Running</Channel> 
      <IsWaitlisted>false</IsWaitlisted> 
    </APIEvent>
    <APIEvent>
      <ID>112</ID> 
      <CustomerID>223</CustomerID> 
      <ParentID>0</ParentID> 
      <Status>Testing</Status> 
      <Title>Event Name</Title> 
      <ClientEventID /> 
      <TypeID>9</TypeID> 
      <TimeZone>GMT</TimeZone> 
      <CurrencyCode>GBP</CurrencyCode> 
      <AddDate>2013-12-18T02:34:09.357</AddDate> 
      <Channel>Running</Channel> 
      <IsWaitlisted>false</IsWaitlisted> 
    </APIEvent>
  </Data>
</ResultsOfListOfEvent>

<ID>each (つまり111and 112) と eachにテキストを出力したい<Title>。これは単なる例です。実行する API に応じて、取得する情報を選択できるようにしたいと考えています。

4

2 に答える 2

11

上記の Pankaj Jaju の回答に基づいた、少し異なるアプローチを次に示します。

ノート:

  • 古い Microsoft.XMLDOM として MSXML2 名前空間を使用します
  • 「SelectionNamespaces」プロパティを使用して、ドキュメントにデフォルトの名前空間がある場合に MSXML2 が XPath で発生する問題を修正します -こちらを参照してください。ドキュメント内のデフォルトの名前空間と同じ URI 参照を持つ名前空間r(任意の名前で構いません) を作成します (http://www.regonline.com/apiこの場合)。
  • 接頭辞が付いていない名前を持つすべての要素の接頭辞として、XPath でその新しい名前空間を使用します。/IDを探すのではなく、探すという複雑な言い方です。/r:ID

コードは次のとおりです。

Sub foo()

Dim xmlDoc As Object
Dim xmlNodeList As Object
Dim xmlNode As Object

Set xmlDoc = CreateObject("MSXML2.DOMDocument.6.0")
xmlDoc.setProperty "SelectionNamespaces", "xmlns:r='http://www.regonline.com/api'"
xmlDoc.async = False
xmlDoc.Load "C:\Users\colin\Desktop\yoz1234.xml"

Set xmlNodeList = xmlDoc.selectNodes("/r:ResultsOfListOfEvent/r:Data/r:APIEvent/r:ID")

For Each xmlNode In xmlNodeList
    MsgBox xmlNode.Text
Next xmlNode

End Sub
于 2014-01-11T02:41:07.877 に答える