Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:解析大型非结构化xml文件_R_Xml_Parsing - Fatal编程技术网

R:解析大型非结构化xml文件

R:解析大型非结构化xml文件,r,xml,parsing,R,Xml,Parsing,我有一个非常复杂的xml文件需要在R中解析并以数据帧格式呈现。其结构可能类似于下面的示例。这些节点不是并行的 <Root> <A> <info1>a</info1> <child> <info2>b</info2> <info3>c</info3> <info4>d</info4> </c

我有一个非常复杂的xml文件需要在R中解析并以数据帧格式呈现。其结构可能类似于下面的示例。这些节点不是并行的

<Root>
  <A>
   <info1>a</info1>
     <child>
       <info2>b</info2>
       <info3>c</info3>
       <info4>d</info4>
     </child>
   <info5>e</info5>
  </A>
  <B>
   <info6>f</info6>
   <info7>g</info7>
  </B>
</Root>
然而,我想要的理想结果是:

info1 info2 info3 info4 info5 info6 info7
  a     b     c     d     e     f     g
由于xml文件中有大量与上述情况类似的节点,因此手动操作dataframe是不明智的。
我还尝试将path语句更改为“//Root/A/child”,那么节点A和节点B下的所有值都将丢失。
有谁能提供这个问题的解决方案吗。提前谢谢

在结构化程度较低的XML中,最好执行以下操作:

library(XML)
Final <- data.frame(xmlToList(rootnode), recursive = T, use.names = T)
库(XML)

最后可以尝试
xmlToList
unlist
以命名向量格式减少
xml
数据。可以使用
gsub
更改名称,以符合OP的期望,如下所示:

library(XML)
result <- unlist(xmlToList(xmlParse(xml)))
#Change the name to refer only child 
names(result) <- gsub(".*\\.(\\w+)$","\\1", names(result))
result 
# info1 info2 info3 info4 info5 info6 info7 
# "a"   "b"   "c"   "d"   "e"   "f"   "g"
库(XML)

结果使用
start-with()匹配节点

所以


query非常感谢Kim,我尝试了该代码,但是它给了我错误消息:参数意味着不同的行数:1,0。非常感谢MKR,根据您的代码,我直接将data.frame添加到未列出的结果。我只使用来自所有节点的值获取数据帧,但不使用列名(节点名)。你知道我可以添加所有节点名和所有值吗?非常感谢。非常感谢Martin,xml文件只是一个示例,我实际的xml文件要比这个复杂得多,每个节点的名称都与其他节点完全不同。因此,使用startswith函数无法执行此任务。但是谢谢你的建议。
library(XML)
Final <- data.frame(xmlToList(rootnode), recursive = T, use.names = T)
library(XML)
result <- unlist(xmlToList(xmlParse(xml)))
#Change the name to refer only child 
names(result) <- gsub(".*\\.(\\w+)$","\\1", names(result))
result 
# info1 info2 info3 info4 info5 info6 info7 
# "a"   "b"   "c"   "d"   "e"   "f"   "g"
xml <- "<Root>
  <A>
  <info1>a</info1>
  <child>
  <info2>b</info2>
  <info3>c</info3>
  <info4>d</info4>
  </child>
  <info5>e</info5>
  </A>
  <B>
  <info6>f</info6>
  <info7>g</info7>
  </B>
  </Root>"
> doc = xmlParse(xml)
> xpathSApply(doc, "//*[starts-with(name(), 'info')]", xmlValue)
[1] "a" "b" "c" "d" "e" "f" "g"
> xpathSApply(doc, "//*[starts-with(name(), 'info')]", xmlName)
[1] "info1" "info2" "info3" "info4" "info5" "info6" "info7"
query <- "//*[starts-with(name(), 'info')]"
setNames(
    xpathSApply(doc, query, xmlValue),
    xpathSApply(doc, query, xmlName)
)