2014-02-12 5 views
1

Я начинаю проект в R-языке, и я должен разбирать XML, я использую библиотеку XML и функции xmlToDataFrame, XMLPARSE и т. Д. Я хочу хранить информацию в структурированном путь на кадре данных, но я столкнулся с проблемой. Я не могу заставить переменные перемещаться внутри узла отдельно, каждый в соответствующем столбце. Используя вышеупомянутые функции, он сохраняет все данные переменных в кадре данных одной ячейки в одной строке.разобрать XML с R

XML-я использую следующим образом:

<?xml version="1.0" encoding="UTF-8"?> 
-<rest-response> 

<type>rest-response</type> 

<time-stamp>1392217780000</time-stamp> 

<status>OK</status> 

<msg-version>1.0.0</msg-version> 

<op>inventory</op> 


-<response> 

<inventorySize>3</inventorySize> 

<inventoryMode>SYNCHRONOUS</inventoryMode> 

<time>4952</time> 


-<items> 


-<item> 

<epc>00000000000000000000A195</epc> 

<ts>1392217779060</ts> 

<location-id>adtr</location-id> 

<location-pos>0,0,0</location-pos> 

<device-id>[email protected]</device-id> 

<device-reader>192.168.1.224</device-reader> 

<device-readerPort>1</device-readerPort> 

<device-readerMuxPort>0</device-readerMuxPort> 

<device-readerMuxPort2>0</device-readerMuxPort2> 

<tag-rssi>-49.0</tag-rssi> 

<tag-readcount>36.0</tag-readcount> 

<tag-phase>168.0</tag-phase> 

</item> 


-<item> 

<epc>00000000000000000000A263</epc> 

<ts>1392217779065</ts> 

<location-id>adtr</location-id> 

<location-pos>0,0,0</location-pos> 

<device-id>[email protected]</device-id> 

<device-reader>192.168.1.224</device-reader> 

<device-readerPort>1</device-readerPort> 

<device-readerMuxPort>0</device-readerMuxPort> 

<device-readerMuxPort2>0</device-readerMuxPort2> 

<tag-rssi>-49.0</tag-rssi> 

<tag-readcount>36.0</tag-readcount> 

<tag-phase>0.0</tag-phase> 

</item> 


-<item> 

<epc>B00000000000001101080802</epc> 

<ts>1392217779323</ts> 

<location-id>adtr</location-id> 

<location-pos>0,0,0</location-pos> 

<device-id>[email protected]</device-id> 

<device-reader>192.168.1.224</device-reader> 

<device-readerPort>1</device-readerPort> 

<device-readerMuxPort>0</device-readerMuxPort> 

<device-readerMuxPort2>0</device-readerMuxPort2> 

<tag-rssi>-72.0</tag-rssi> 

<tag-readcount>27.0</tag-readcount> 

<tag-phase>157.0</tag-phase> 

</item> 

</items> 

</response> 

</rest-response> 

Все внутри вещь получает его как одно значение, и я хочу разлучает разными понятиями.

Другим важным моментом является то, что XML может измениться, но его структура всегда будет то же самое, но может быть больше пунктов

Любая идея?

+0

Просьба поделиться кодом, который вы уже пробовали. – Ramnath

ответ

2

Так что я предполагаю, что вы хотите <items> в фрейме данных. Предположим, что ваш XML в переменной xml.text, это будет работать:

library(XML) 
xml <- xmlInternalTreeParse(xml.text) # assumes your xml in variable xml.text 
items <- getNodeSet(xml,"//items/item") 
df <- xmlToDataFrame(items) 
df 
#      epc   ts location-id location-pos device-id device-reader device-readerPort device-readerMuxPort device-readerMuxPort2 tag-rssi tag-readcount tag-phase 
# 1 00000000000000000000A195 1392217779060  adtr  0,0,0 [email protected] 192.168.1.224     1     0      0 -49.0   36.0  168.0 
# 2 00000000000000000000A263 1392217779065  adtr  0,0,0 [email protected] 192.168.1.224     1     0      0 -49.0   36.0  0.0 
# 3 B00000000000001101080802 1392217779323  adtr  0,0,0 [email protected] 192.168.1.224     1     0      0 -72.0   27.0  157.0 

Я также предположил, что вы отображается этот XML в браузере и вырезать/вставить (что бы объяснить -<tag>). В противном случае ваш xml не будет корректно сформирован.

+0

Действительно аккуратно, что 'xmlToDataFrame' работает над набором узлов; два куска синтаксического сахара 'xml <- xmlParse (xml.text); xmlToDataFrame (xml ["// items/item"]) ' –

+0

@MartinMorgan - Я не понимал, что можно использовать XPath в документе, рассматривая его как« индекс ». Очень круто. Вы знаете способ преобразования столбца 'ts' в POSIXct непосредственно в вызове' xmlToDataFrame (...) '? Я не могу заставить его работать с 'colClasses ='. – jlhoward

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