用R解析XML

问题描述:

我在R语言中启动一个项目,我必须解析一个XML,我正在使用XML库和函数xmlToDataFrame,XMLPARSE等。我想将信息存储在结构中在数据框上的方式,但我遇到了一个问题。我无法单独获取变量,而是分别在适当的列中获取变量。通过使用上述功能,它将单个单元格中的变量的所有数据保存在一个单独的行中。用R解析XML

我使用的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

所以我假设想在数据框中使用<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 

我还以为你在浏览器和剪切/粘贴(这可以解释的-<tag>)显示该XML。否则,你的xml格式不正确。

+0

真的很简单,'xmlToDataFrame'工作在一个节点集上;两个语法糖块'xml

+0

@MartinMorgan - 我没有意识到可以在文档上使用XPath,将其视为“索引”。很酷。你知道在调用'xmlToDataFrame(...)'的时候直接将'ts'列转换为POSIXct的方法吗?我无法让它与'colClasses ='一起工作。 – jlhoward