Извлечь данные из файла XML в MS Excel с помощью vba - PullRequest
0 голосов
/ 02 августа 2020

Привет, у меня есть ответ xml от API, я хочу извлечь данные из xml файла для Excel, но все поля находятся в разделе. Я новичок в XML, и я не могу извлечь данные из раздела. Я попытался написать код, но ничего не вышло.

Я написал код, но он не работает.

Sub Test()

    Dim sXml As String
    sXml = "<Root><SomeData>foo</SomeData>" & _
        "<SomeCDATA><![CDATA[<img src=""http://l.yimg.com/a/i/us/we/52/26.gif""/>]]>" & _
        "</SomeCDATA></Root>"
    'Tools->References->Microsoft Xml v.60
    Dim dom As MSXML2.DOMDocument60
    Set dom = New MSXML2.DOMDocument60
    dom.LoadXML "C:\Users\u6045100\Desktop\macros\response_1595215180468.xml"
    Debug.Assert dom.parseError = 0
    
    Dim xChlNode As IXMLDOMNodeList
    Set xChlNode = dom.ChildNodes.Item(1).ChildNodes
    For Each xChl In xChlNode
        Debug.Print xChl.BaseName
        Debug.Print xChl.NodeType 'NODE_ELEMENT (1) - Full List Here: https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms753745(v=vs.85)
    Next

    Dim xmlSomeCData As MSXML2.IXMLDOMElement
    Set xmlSomeCData = dom.SelectSingleNode("/response")

    Debug.Print xmlSomeCData.text

    '* or your suggestion :)
    Dim xmlSomeCDataSection As MSXML2.IXMLDOMCDATASection
    Set xmlSomeCDataSection = dom.SelectSingleNode("Root/SomeCDATA/text()")

    Debug.Print xmlSomeCDataSection.text

End Sub

Я делюсь файлом xml здесь

1 Ответ

0 голосов
/ 02 августа 2020

Данные, которые вам нужны, являются отдельным XML документом, встроенным в раздел CDATA ответа XML.

Вам необходимо извлечь XML и загрузить его во второй объект документа, чтобы вы можете извлечь нужные данные.

Например:

    Sub Test()
        
        'Tools->References->Microsoft Xml v.60
        Dim dom As MSXML2.DOMDocument60, childDoc As MSXML2.DOMDocument60
        Dim recXML As String, rec, recs
        
        Set dom = New MSXML2.DOMDocument60
        Set childDoc = New MSXML2.DOMDocument60
        
        dom.Load "C:\Users\Tim\OneDrive\Desktop\temp\response.xml"
        
        'you need to set up the namespace property
        dom.SetProperty "SelectionNamespaces", "xmlns:abc='http://www.isinet.com/xrpc42'"
        
        Dim xmlSomeCData As MSXML2.IXMLDOMElement
        'use the namspace alias we created earlier when querying
        Set xmlSomeCData = dom.SelectSingleNode("abc:response/abc:map/abc:map/abc:val")
    
        recXML = xmlSomeCData.Text '<<< the text in the CDATA section is the source XML
                                   '    to be loaded into ChildDoc
        childDoc.LoadXML recXML
        'select some nodes from the embedded xml document....
        Set recs = childDoc.SelectNodes("//records/REC/UID")
        Debug.Print recs.Length
        For Each rec In recs
            Debug.Print rec.Text
        Next rec
    
    End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...