2015-11-13 4 views
1

Я получаю XML DataTable (тот, что они называют структуру) из SOAP API, который выглядит следующим образом:Преобразование XML DataTable в R Dataframe

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Body> 
     <UniversalFieldGroupingResponse xmlns="http://rixtrema.net/"> 
     <UniversalFieldGroupingResult> 
      <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata" id="NewDataSet"> 
       <xs:element name="NewDataSet" msdata:IsDataSet="true" msdata:MainDataTable="RESULT" msdata:Locale="en-US"> 
        <xs:complexType> 
        <xs:choice minOccurs="0" maxOccurs="unbounded"> 
         <xs:element name="RESULT" msdata:CaseSensitive="False" msdata:Locale="en-US"> 
          <xs:complexType> 
           <xs:sequence> 
           <xs:element name="Group" type="xs:string" minOccurs="0" /> 
           <xs:element name="Value" type="xs:double" minOccurs="0" /> 
           <xs:element name="Name" type="xs:string" minOccurs="0" /> 
           <xs:element name="ID" type="xs:double" minOccurs="0" /> 
           </xs:sequence> 
          </xs:complexType> 
         </xs:element> 
        </xs:choice> 
        </xs:complexType> 
       </xs:element> 
      </xs:schema> 
      <diffgr:diffgram xmlns:diffgr="urn:schemas-microsoft-com:xml-diffgram-v1" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
       <DocumentElement xmlns=""> 
        <RESULT diffgr:id="RESULT1" msdata:rowOrder="0" diffgr:hasChanges="inserted"> 
        <Group>GLOBAL FUNDS</Group> 
        <Value>43.909752322865359</Value> 
        <Name>DIREXION DLY JR GOLD BEAR 3X</Name> 
        <ID>2</ID> 
        </RESULT> 
        <RESULT diffgr:id="RESULT2" msdata:rowOrder="1" diffgr:hasChanges="inserted"> 
        <Group>GLOBAL FUNDS</Group> 
        <Value>49.355249530959405</Value> 
        <Name>DIRXN DAILY JR BULL GOLD 3X</Name> 
        <ID>3</ID> 
        </RESULT> 
        <RESULT diffgr:id="RESULT3" msdata:rowOrder="2" diffgr:hasChanges="inserted"> 
        <Group>GLOBAL FUNDS</Group> 
        <Value>25.683552161722936</Value> 
        <Name>Direxion Daily Small Cap Bull 3X Shares</Name> 
        <ID>4</ID> 
        </RESULT> 
        <RESULT diffgr:id="RESULT4" msdata:rowOrder="3" diffgr:hasChanges="inserted"> 
        <Group>GLOBAL FUNDS</Group> 
        <Value>38.662180870630991</Value> 
        <Name>Direxion Daily Gold Miners Bear 3X Shrs</Name> 
        <ID>5</ID> 
        </RESULT> 
        <RESULT diffgr:id="RESULT5" msdata:rowOrder="4" diffgr:hasChanges="inserted"> 
        <Group>GLOBAL FUNDS</Group> 
        <Value>28.857511273261132</Value> 
        <Name>Direxion Daily Small Cap Bear 3X Shares</Name> 
        <ID>6</ID> 
        </RESULT> 
        ... 
       </DocumentElement> 
      </diffgr:diffgram> 
     </UniversalFieldGroupingResult> 
     </UniversalFieldGroupingResponse> 
    </soap:Body> 
</soap:Envelope> 

Я ничего не знаю о XML, но я Я пытаюсь использовать пакет XML, в частности, xmlToList() или xmlTODataFrame(). Я могу работать со списком, чтобы в конечном итоге получить структуру, которую я хотел бы, но это больно. Я не могу заставить xmlToDataFrame делать что-нибудь полезное. (Все, что я вернусь это одна строка, содержащая все данные.) Вот рабочий xmlToList() подход:

theResult2 <- xmlToList(theResult$value()) 
theResult2 <- (theResult2$Body$UniversalFieldGroupingResponse$UniversalFieldGroupingResul$diffgram$DocumentElement) 
test <- as.data.frame(unname(t(sapply(theResult2, function(x) (unlist(x)[c(3,1,2)]))))) 

И это дает то, что я могу работать с:

> test 
             V1   V2     V3 
1    DIREXION DLY JR GOLD BEAR 3X GLOBAL FUNDS 43.909752322865359 
2    DIRXN DAILY JR BULL GOLD 3X GLOBAL FUNDS 49.355249530959405 
3 Direxion Daily Small Cap Bull 3X Shares GLOBAL FUNDS 25.683552161722936 
4 Direxion Daily Gold Miners Bear 3X Shrs GLOBAL FUNDS 38.662180870630991 
5 Direxion Daily Small Cap Bear 3X Shares GLOBAL FUNDS 28.857511273261132 
6 Direxion Daily Financial Bear 3X Shares GLOBAL FUNDS 27.286991074091898 

Кто-нибудь есть некоторые более элегантный способ сделать это? Или какие-то предложения?

ответ

1

Благодаря в основном к @lukeA, я получил следующее к работе:

> tester <- xmlParse(theResult$value()) 
> dd = xmlToDataFrame(getNodeSet(tester, "//RESULT")) 
> dd 
      Group    Value         Name ID 
1 GLOBAL FUNDS 43.909752322865359   DIREXION DLY JR GOLD BEAR 3X 2 
2 GLOBAL FUNDS 49.355249530959405    DIRXN DAILY JR BULL GOLD 3X 3 
3 GLOBAL FUNDS 25.683552161722936 Direxion Daily Small Cap Bull 3X Shares 4 
4 GLOBAL FUNDS 38.662180870630991 Direxion Daily Gold Miners Bear 3X Shrs 5 
5 GLOBAL FUNDS 28.857511273261132 Direxion Daily Small Cap Bear 3X Shares 

Я хорошо, и я ценю это!

Смежные вопросы