【问题标题】:parse an XML with R用 R 解析 XML
【发布时间】:2014-02-12 18:48:49
【问题描述】:

我正在用 R 语言开始一个项目,我必须解析 XML,我正在使用 XML 库和函数 xmlToDataFrame、XMLPARSE 等。我想以结构化方式将信息存储在数据帧上,但是我遇到了一个问题。我无法在一个节点中单独获取变量,每个变量都在其相应的列中。通过使用上述功能,它将数据框中变量的所有数据保存在一行中的单个单元格中。

我使用的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>adtr@1</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>adtr@1</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>adtr@1</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>

item 中的所有内容都将其作为单个值,我想用不同的概念来分解。

另一个重要的一点是XML可能会改变,但它的结构总是一样的,但可能会有更多的项目

有什么想法吗?

【问题讨论】:

  • 请分享您已经尝试过的代码。

标签: xml r parsing xmlnode


【解决方案1】:

所以我假设想要 &lt;items&gt; 在数据框中。假设您的 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    adtr@1 192.168.1.224                 1                    0                     0    -49.0          36.0     168.0
# 2 00000000000000000000A263 1392217779065        adtr        0,0,0    adtr@1 192.168.1.224                 1                    0                     0    -49.0          36.0       0.0
# 3 B00000000000001101080802 1392217779323        adtr        0,0,0    adtr@1 192.168.1.224                 1                    0                     0    -72.0          27.0     157.0

我还假设您在浏览器中显示此 xml 并剪切/粘贴(这将解释 -&lt;tag&gt;)。否则,您的 xml 格式不正确。

【讨论】:

  • xmlToDataFrame 在节点集上工作真的很简洁;两块语法糖xml &lt;- xmlParse(xml.text); xmlToDataFrame( xml["//items/item"] )
  • @MartinMorgan - 我没有意识到可以通过将文档视为“索引”来在文档上使用 XPath。很酷。您知道在对xmlToDataFrame(...) 的调用中直接将ts 列转换为POSIXct 的方法吗?我无法让它与 colClasses= 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-09
  • 1970-01-01
  • 1970-01-01
  • 2012-11-08
相关资源
最近更新 更多