Я получаю 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
Кто-нибудь есть некоторые более элегантный способ сделать это? Или какие-то предложения?