getElementsByTagName и необъявленное пространство имен - PullRequest
0 голосов
/ 17 мая 2019

Я работаю над проектом по импорту данных запроса в Excel с помощью вызова SOAP. Я могу вернуть XML без проблем, и это выглядит так.

<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <soap:Body>
        <RetrieveRequestsResponse xmlns="http://rapid2.library.colostate.edu/rapid5api/">
            <RetrieveRequestsResult>
                <IsSuccessful>true</IsSuccessful>
                <Transactions>
                    <Transaction>
                        <RapidRequestId>1111</RapidRequestId>
                        <XRefRequestId>[TN:11111]</XRefRequestId>
                        <StateType>Pending</StateType>
                        <RapidRequestType>Article</RapidRequestType>
                        <BorrowerRapidCode>###</BorrowerRapidCode>
                        <BorrowerCountryCode>AU</BorrowerCountryCode>
                    </Transaction>
                </Transactions>
            </RetrieveRequestsResult>
        </RetrieveRequestsResponse>
    </soap:Body>
</soap:Envelope>

моя проблема возникает, когда я пытаюсь проанализировать и отобразить XML в Excel.

Использование этого превосходного учебника Я создал следующий код

Dim Resp As New DOMDocument60
Resp.LoadXML xmlhtp.responseText

Dim transaction As IXMLDOMNode
Dim XmlNamespaces As String
Dim i As Integer

  XmlNamespaces = "xmlns:doc2='http://rapid2.library.colostate.edu/rapid5api/'
Resp.setProperty "SelectionNamespaces", XmlNamespaces

For Each transaction In Resp.getElementsByTagName("Transaction")
 Debug.Print "tesst"
    i = i + 1
    WS.Range("A2:A200").Cells(1, i).Value = transaction.SelectNodes("//doc2:RapidRequestId")(0).Text

 Next Transaction

End With
End Sub

однако это возвращает «ничто» для транзакции в Locals и пропускает цикл, когда я отлаживаю.

После дальнейших исследований Я наткнулся на этот пост , который, кажется, касается моей проблемы необъявленного пространства имен?

<RetrieveRequestsResponse xmlns="http://rapid2.library.colostate.edu/rapid5api/">

После некоторой бесцельной настройки моего кода я получил:

Dim Resp As New DOMDocument60
Resp.LoadXML xmlhtp.responseText

Dim Transaction As IXMLDOMNode
Dim XmlNamespaces As String
Dim i As Integer

XmlNamespaces = "xmlns:doc2='http://rapid2.library.colostate.edu/rapid5api/'"
Resp.setProperty "SelectionNamespaces", XmlNamespaces

 For Each transaction In Resp.getElementsByTagName("Transaction")
  Debug.Print "tesst"                                                                                                          
     i = i + 1
     WS.Range("A2:A200").Cells(1, i).Value =  Transaction.SelectNodes("//doc2:RapidRequestId")(0).Text
 Next Transaction

End With
End Sub

Теперь это возвращает две строки RequestID, однако они оба одинаковы. В идеале мне нужно иметь возможность отображать данные со всех узлов в

<Transaction>

Большое спасибо

Sam

1 Ответ

0 голосов
/ 17 мая 2019

Это сработало для меня:

Dim Resp As New DOMDocument60

Resp.setProperty "SelectionLanguage", "XPath"
Resp.LoadXML Range("C1").Value '<<< loading from worksheet for testing

Dim Transaction As IXMLDOMNode
Dim XmlNamespaces As String
Dim i As Integer

XmlNamespaces = "xmlns:doc2='http://rapid2.library.colostate.edu/rapid5api/'"
Resp.setProperty "SelectionNamespaces", XmlNamespaces

 For Each Transaction In Resp.SelectNodes("//doc2:Transaction")
    Debug.Print "--------------"
    Debug.Print Transaction.SelectSingleNode("doc2:RapidRequestId").Text
    Debug.Print Transaction.SelectSingleNode("doc2:XRefRequestId").Text
 Next Transaction
...