解析R中的XML文件,该文件的子节点具有具有相同标记的所有值
我有一个关于XML文件解析的问题。然后我将我的函数和一个示例XML文件放在一起。 我的问题是:在这个文件中,我可以毫无问题地解析子节点“item”和子节点“tag”,但是当我尝试解析子节点prop时,我得到一个包含所有值的字符串在一起XML解析函数不区分它们,因为它们都有相同的标签“prop”。我需要子节点值在data.frame中存储在不同的列中,有什么方法可以做到这一点吗 我的职能:解析R中的XML文件,该文件的子节点具有具有相同标记的所有值,xml,r,parsing,nodes,Xml,R,Parsing,Nodes,我有一个关于XML文件解析的问题。然后我将我的函数和一个示例XML文件放在一起。 我的问题是:在这个文件中,我可以毫无问题地解析子节点“item”和子节点“tag”,但是当我尝试解析子节点prop时,我得到一个包含所有值的字符串在一起XML解析函数不区分它们,因为它们都有相同的标签“prop”。我需要子节点值在data.frame中存储在不同的列中,有什么方法可以做到这一点吗 我的职能: PARSE_INVENTORY_items<-function(DF_DEVICE_IDE_v
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)
}
}
PARSE_INVENTORY_items,因此您的XML格式仍然不正确(缺少
的结束标记,但足够接近,可以使用)
下面的代码从
元素的内容创建一个数据框,每个
元素有一行,每个
元素有列,
和每个
元素。不同
元素的列名从文本中解析出来(因此,RF\u相位
,读取计数
,等等)。请注意,如果每个
都具有相同的
,则is有效
在本例中,您提供(更正)的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
库(XML)
xml您的“示例xml文件”不是xml-项目、库存等没有结束标记。请编辑您的问题以更正此问题。是的,对不起,xml很长,我只放了一部分。完成了。非常感谢,您帮了我很多忙:)(我在xml中添加了缺少的标记)
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