解析R中的XML文件,该文件的子节点具有具有相同标记的所有值

解析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

我有一个关于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)
  }
}

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