2015-08-13 4 views
2

В настоящее время у меня есть ответ XML от вызова API SOAP, который я проанализировал в порядке XMLInternalDocument. У меня возникли проблемы с извлечением определенных узлов из обработанного ответа.Анализ XML-ответа в R

Ниже приведен подход, который я попытался извлечь из ответа XML.

library(XML) 

responseparsed <- XML::xmlParse("response2.xml") 
getNodeSet(responseparsed, "//Category") 

Ответ я получаю пустой список (т.е. нет содержания в моем понимании)

# list() 
# attr(,"class") 
# [1] "XMLNodeSet" 

Я в конечном итоге хочет получить мой ответ XML в data.frame, если это возможно, так будет на самом деле оцените некоторые указатели, потому что я также не мог получить xmlToList, чтобы работать либо из-за <header>, и < body> оба находятся в пакете XML.

Если вы берете приведенный ниже фрагмент и создаете XML-файл с именем response2.xml, тогда вы должны иметь возможность воспроизвести мою проблему.

<?xml version="1.0" encoding="utf-8"?> 
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> 
    <soap:Header> 
    <wsa:Action>RetrieveResponse</wsa:Action> 
    <wsa:MessageID>urn:uuid:mymessageid</wsa:MessageID> 
    <wsa:RelatesTo>urn:uuid:relatestoid</wsa:RelatesTo> 
    <wsa:To>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:To> 
    <wsse:Security><wsu:Timestamp wsu:Id="Timestamp-c74b9126-8c79-4624-abd1-de4021ce1096"> 
     <wsu:Created>2015-08-13T12:38:54Z</wsu:Created> 
     <wsu:Expires>2015-08-13T12:43:54Z</wsu:Expires> 
    </wsu:Timestamp></wsse:Security> 
    </soap:Header> 
    <soap:Body> 
    <RetrieveResponseMsg xmlns="http://exacttarget.com/wsdl/partnerAPI"> 
     <OverallStatus>OK</OverallStatus> 
     <RequestID>myanonrequestid</RequestID> 
     <Results xsi:type="List"> 
     <Client> 
      <ID>6212693</ID> 
     </Client> 
     <PartnerKey xsi:nil="true" /> 
     <ID>537</ID> 
     <ObjectID xsi:nil="true" /> 
     <ListName>All Subscribers</ListName> 
     <Category>2151</Category> 
     <Type>Private</Type> 
     </Results> 
     <Results xsi:type="List"> 
     <Client> 
      <ID>6212693</ID> 
     </Client> 
     <PartnerKey xsi:nil="true" /> 
     <ID>1217</ID> 
     <ObjectID xsi:nil="true" /> 
     <ListName>list A</ListName> 
     <Category>3038</Category> 
     <Type>Private</Type> 
     </Results> 
     <Results xsi:type="List"> 
     <Client> 
      <ID>6212693</ID> 
     </Client><PartnerKey xsi:nil="true" /> 
     <ID>1434</ID><ObjectID xsi:nil="true" /> 
     <ListName>List B</ListName> 
     <Category>6362</Category> 
     <Type>Private</Type> 
     </Results> 
     <Results xsi:type="List"> 
     <Client> 
      <ID>6212693</ID> 
     </Client> 
     <PartnerKey xsi:nil="true" /> 
     <ID>1435</ID> 
     <ObjectID xsi:nil="true" /> 
     <ListName> List C</ListName> 
     <Category>6362</Category> 
     <Type>Private</Type> 
     </Results> 
    </RetrieveResponseMsg> 
    </soap:Body> 
</soap:Envelope> 

ответ

3

Category наследует от пространства имен по умолчанию RetrieveResponseMsg предка элемента. Чтобы ссылаться на элемент в пространстве имен с помощью XPath, вам нужно сопоставить префикс, чтобы указать на uri пространства имен, и использовать этот префикс в вашем XPath. Я не очень хорошо знаком с r, но я думаю, что это будет примерно так:

getNodeSet(responseparsed, "//d:Category", c(d="http://exacttarget.com/wsdl/partnerAPI"))