用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可能会改变,但它的结构将始终是相同的,但有可能是更多的项目
任何想法?
所以我假设想在数据框中使用<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格式不正确。
真的很简单,'xmlToDataFrame'工作在一个节点集上;两个语法糖块'xml
@MartinMorgan - 我没有意识到可以在文档上使用XPath,将其视为“索引”。很酷。你知道在调用'xmlToDataFrame(...)'的时候直接将'ts'列转换为POSIXct的方法吗?我无法让它与'colClasses ='一起工作。 – jlhoward
请分享您已经尝试的代码。 – Ramnath