2015-11-13 66 views
1

我正在一个XML数据表(那是什么,他们都呼吁的结构)从SOAP API,它看起来像如下:将XML数据表与R数据框

<?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()。我可以使用list函数来最终获得我想要的结构,但这很痛苦。我无法让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 

我好,我很欣赏它!