我对XML文件的解析有疑问。然后,我放入函数和一个示例XML文件。我的问题是:在这个文件中,我可以解析子节点``item''和子节点``tag''而没有问题,但是当我尝试解析子节点prop时,我得到了一个包含所有值的字符串。XML解析功能无法区分它们,因为它们都具有相同的标签“ prop”。我需要将子节点值存储在data.frame内的单独列中,有什么方法可以做到这一点?
我的功能:
PARSE_INVENTORY_items<-function(DF_DEVICE_IDE_value, URL_DEVICE_value){
require(XML)
require(RCurl)
host<-URL_DEVICE_value
device<-"/devices/"
ID_devices<-DF_DEVICE_IDE_value[1,1]
inventory<-"/inventory"
start_device<-"/start"
FULL_url<-paste(host, device, ID_devices, inventory, sep="")
FULL_url_start<-paste(host, device, ID_devices, start_device, sep="")
URL_inventory<-gsub(" ","", FULL_url, fixed=TRUE)
URL_start_device<-gsub(" ","", FULL_url_start, fixed=TRUE)
httpGET(URL_start_device)
XML_inventory_exists = url.exists(URL_inventory)
# Regular HTTP
if( XML_inventory_exists) {
inventory = getURL(URL_inventory)
inventory_xml <- xmlInternalTreeParse(inventory)
items <- getNodeSet(inventory_xml,"//data/inventory/items/item")
DataFrame_inventory_items <- xmlToDataFrame(items)
items_tags<-getNodeSet(inventory_xml, "//data/inventory/items/item/tags/tag")
DataFrame_inventory_tags_subnode <- xmlToDataFrame(items_tags)
#items_tags_props<-getNodeSet(inventory_xml, "//data/inventory/items/item/tags/tag/props/prop")
#DataFrame_inventory_props_subnode_tag <- xmlToDataFrame(items_tags_props)
DataFrame_inventory_items<-cbind(DataFrame_inventory_items,DataFrame_inventory_tags_subnode)
#aux<-DataFrame_inventory_items
#DataFrame_inventory_items<-subset(DataFrame_inventory_items, select=(-tags))
return(DataFrame_inventory_items)
}
}
XML文件示例
<?xml version="1.0" encoding="UTF-8"?>
<inventory>
<type>inventory</type>
<ts>1396964708000</ts>
<status>OK</status>
<msg-version>2.0.0</msg-version>
<op>inventory</op>
<data>
<advanNetId>AdvanNet-instance-00:26:b9:08:cd:e1-3161</advanNetId>
<deviceId>adrd1</deviceId>
<inventory>
<class>INVENTORY</class>
<deviceId>adrd1</deviceId>
<timeWindow>2500</timeWindow>
<items>
<item>
<class>READ_EVENT</class>
<epc>00000000000000000000A200</epc>
<ts>1396964708122</ts>
<deviceId>adrd1</deviceId>
<tags>
<tag>
<class>CONTEXT_TAG_DATA</class>
<hexepc>00000000000000000000A200</hexepc>
<props>
<prop>RF_PHASE:154</prop>
<prop>READ_COUNT:1</prop>
<prop>RSSI:-55</prop>
<prop>TIME_STAMP:1396964708122</prop>
<prop>ANTENNA_PORT:1</prop>
</props>
</tag>
</tags>
<tag-rssi>-55.0</tag-rssi>
<tag-readcount>1</tag-readcount>
<tag-phase>154.0</tag-phase>
</item>
</items>
</inventory>
</data>
</inventory>
因此,您的XML格式仍然不正确(缺少的结束标记<items>
,但足够接近以致无法使用。
下面的代码创建从内容的数据帧<tags>
元件,用1行的每个<tag>
元件,并且具有用于列<class>
,<hexepc>
并且每个的<prop>
元件。从不同的列名<prop>
的元素被解析出来的文字的(因此,RF_PHASE
,READ_COUNT
等等)。请注意,如果每个参数<tag>
都相同,则该方法有效<props>
。
在此示例中,您提供(更正)的xml称为xml.text
。
library(XML)
xml <- xmlInternalTreeParse(xml.text,useInternalNodes=T)
# add a few extra tag nodes - you have this already
tags <- xml["//data/inventory/items/item/tags"]
tag <- xml["//data/inventory/items/item/tags/tag"]
addChildren(node=tags[[1]],xmlClone(tag[[1]]))
addChildren(node=tags[[1]],xmlClone(tag[[1]]))
addChildren(node=tags[[1]],xmlClone(tag[[1]]))
# this is where you start
tags <- xml["//data/inventory/items/item/tags/tag"]
result <- do.call(rbind,lapply(tags,function(tag){
class <- xmlValue(tag["class"][[1]])
hexepc <- xmlValue(tag["hexepc"][[1]])
props <- sapply(tag["props"]$props["prop"],xmlValue)
props <- strsplit(props,":")
props <- setNames(sapply(props,function(x)x[2]),sapply(props,function(x)x[1]))
c(class=class,hexepc=hexepc,props)
}))
result <- data.frame(result)
# class hexepc RF_PHASE READ_COUNT RSSI TIME_STAMP ANTENNA_PORT
# 1 CONTEXT_TAG_DATA 00000000000000000000A200 154 1 -55 1396964708122 1
# 2 CONTEXT_TAG_DATA 00000000000000000000A200 154 1 -55 1396964708122 1
# 3 CONTEXT_TAG_DATA 00000000000000000000A200 154 1 -55 1396964708122 1
# 4 CONTEXT_TAG_DATA 00000000000000000000A200 154 1 -55 1396964708122 1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句