2016-12-19 18 views
0

APIから返されたXMLの解析に問題があります。私の主なポイントは、ノードの1つ(xPathを使用)の「使用済み」および「制限」プロパティを取得することです。VBAでのXML解析

<?xml version="1.0" encoding="UTF-8"?> 
<QueryResultRecords xmlns="http://www.xmlns.loc/sub" type="application/some.app.query+xml" href="https://my.api.call.com/query?has_cheezburger" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.xmlns.loc/sub http://my.api.address.com/schema/master.xsd"> 
    <OnlyNodeType Name="name1" link="hhttp://my.api.address.com/a5d11b73dffe" Used="240640" Limit="0" /> 
    <OnlyNodeType Name="name2" link="http://my.api.address.com/03b11042ccd4" Used="10240" Limit="409600" /> 
    <OnlyNodeType Name="name3" link="http://my.api.address.com/1cf43be18e2e" Used="11934947" Limit="20971520" /> 
</QueryResultRecords> 

私は大体どのようにXMLDOMの作品を理解する:

今の私も

ザ・返されたXMLは次のようになり、私は助けを求めてくるので、ここでは、全体のXMLツリーを探索するために管理していませんVBAで、しかし、ウェブ検索、私はそれが(私はXMLDに何かを理解していなかったのxml-トリーイングの問題だと思う...明らかに動作しない、これを書くために

Dim XMLDOC As MSXML2.DOMDocument60 
Dim nodelist As IXMLDOMNodeList 
Set XMLDOC = New MSXML2.DOMDocument60 
XMLDOC.async = False 
XMLDOC.validateOnParse = False 
XMLDOC.Load (myhttpresponse) 

Namespace = "xmlns: 'http://www.xmlns.loc/sub' " 
Call XMLDOC.setProperty("SelectionNamespaces", Namespace) 
Call XMLDOC.setProperty("SelectionLanguage", "XPath") 

XPath = "/" 

Set nodelist = XMLDOC.SelectNodes(XPath) 
For i = 0 To nodelist.Length - 1 
    Set Node = nodelist.NextNode 
    Debug.Print Node.Text 
Next i 

を管理しますom?)またはxmlns/xsiの問題が発生し、完全にスタックしました。

誰もがこの上で私を助けてもらえますか?

答えて

0

XMLに接頭辞がない場合でも、使用するすべての名前空間の名前空間接頭辞を選択する必要があります。ここで

私はhttp://www.xmlns.loc/sub名前空間を参照するためにsubを使用しています。 (xmlns:foo="http://foo"とは反対にxmlns="http://foo"のように、明示的な接頭辞なしの名前空間宣言)

Option Explicit 

Sub Test() 
    Dim XmlDoc As MSXML2.DOMDocument60 
    Dim OnlyNodeType As MSXML2.IXMLDOMElement 

    Set XmlDoc = GetXml("https://my.api.call.com/query?has_cheezburger") 
    XmlDoc.setProperty "SelectionNamespaces", "xmlns:sub='http://www.xmlns.loc/sub'" 

    For Each OnlyNodeType In XmlDoc.SelectNodes("//sub:OnlyNodeType") 
     Debug.Print OnlyNodeType.GetAttribute("link") 
    Next OnlyNodeType 
End Sub 

Function GetXml(url As String) As MSXML2.DOMDocument60 
    With New MSXML2.XMLHTTP60 
     .Open url 
     .Send 
     Set GetXml = .responseXML 
     GetXml.setProperty "SelectionLanguage", "XPath" 
    End With 
End Function 

XMLは、デフォルトの名前空間の利便施設があります。この便利な機能はXPathには存在しません。ここでは、すべての名前空間参照は明示的でなければなりません。

限り、名前空間URIが一致したとして、あなたが好きなプレフィックスを選択することができます。

+0

私は、あなたが私をたくさん助けたと思うありがとう:)小さな問題を、しかし:MSXML2.DOMElementとして 点心OnlyNodeTypeは、VBAで認識できないことのようです。私はMS XML v6.0をロードしましたが、とにかくそのリファレンスはありません。私はあなたの間違いを賭けましたが、まだですか? – Ariel

+0

もちろん、私は 'IXMLDOMElement'を意味しました。 'IXMLDOMNode'を使うこともできます。ノードはDOM要素の基本型です。メソッドやプロパティは少なくなりますが、XPathクエリのすべての種類の結果に対して機能します。オブジェクトブラウザ(F2のVBA IDE)を使用して、さまざまなオブジェクトの違いを調べます。 – Tomalak

+0

本当にありがとうございます。私は実際には '/サブである、あなたが与えたたxPath方法を修正する必要がstilla:QueryResultRecords /サブ:OnlyNodeType' – Ariel