2016-12-19 3 views
0

У меня возникли проблемы с разбором XML, возвращаемого из API. Мое главное в этом состоит в том, чтобы получить «используемые» и «предельные» свойства одного из узлов (с xPath).Анализ XML в VBA

На данный момент я даже не успел изучить весь XML-дерево, так что здесь я приезжаю с просьбой о помощи

Возвращенный 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 в VBA, но поиск в Интернете, мне удалось написать это, что, очевидно, не работает ...

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 

Я думаю, что это проблема XML-Treeing (я не понял, что-то на XMLD om?) или xmlns/xsi, и там я полностью застрял.

Может ли кто-нибудь помочь мне в этом?

ответ

0

Вы должны выбрать префикс пространства имен для каждого пространства имен, которое вы хотите использовать, даже если префикс в XML отсутствует.

Здесь я использую sub для ссылки на пространство имен http://www.xmlns.loc/sub.

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 имеет удобство объекта пространства имен по умолчанию (объявления пространства имен без явного префикса, как xmlns="http://foo" в отличие от xmlns:foo="http://foo"). Этот удобный объект не существует для XPath. Здесь каждая ссылка пространства имен должна быть явной.

Пока совпадает URI пространства имен, вы можете выбрать любой префикс, который вам нравится.

+0

Я думаю, что вы мне очень помогли, спасибо :) Небольшая проблема: Dim OnlyNodeType Как MSXML2.DOMElement, похоже, не распознается VBA. Я загрузил MS XML v6.0, но никаких ссылок на это в любом случае. Я держал пари на вашей ошибке, но все же? – Ariel

+0

Конечно, я имел в виду 'IXMLDOMElement'. Вы также можете использовать 'IXMLDOMNode'. Узел является базовым типом элемента DOM - он предлагает меньше методов и свойств, но взамен он работает для всех возможных типов результатов запроса XPath. Используйте Обозреватель объектов (F2 - VBA IDE), чтобы изучить различия между различными объектами. – Tomalak

+0

Спасибо, действительно. Я все еще должен исправить xPath, который вы дали, что на самом деле '/ sub: QueryResultRecords/sub: OnlyNodeType' – Ariel