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

标签 r xml parsing

我有一个非常复杂的 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>

我想出了一些代码来解析文件:

doc <- xmlParse(file="sample.xml", useInternal = TRUE)
rootnode <- xmlRoot(doc)
df1<-xmlToDataFrame(nodes=getNodeSet(rootnode, "//Root/A"))
df2<-xmlToDataFrame(nodes=getNodeSet(rootnode, "//Root/B"))
Final<-cbind.data.frame(df1,df2, all=TRUE)

返回的结果为:(所有值表单节点都收缩在一起)

info1 child info5 info6 info7
  a    bcd    e     f     g

然而,我想要的理想结果是:

info1 info2 info3 info4 info5 info6 info7
  a     b     c     d     e     f     g

由于类似上述情况的xml文件中存在大量节点,手动操作dataframe并不明智。
我也尝试把路径语句改成“//Root/A/child”,那么节点A和节点B下的所有值都会丢失。 有没有人可以提供解决这个问题的方法。提前致谢。

最佳答案

可以尝试使用 xmlToListunlist 来减少命名矢量格式的 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 <- "<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>"

关于R:解析大型非结构化 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50142628/

相关文章:

r - 如何在 Shiny 的应用程序中使用响应式设计?

R 基准代码不生成输出

r - 如何使用 ggplot2 限制 stat_function 图的范围?

python - 在 Python 中解析 XML 字符串片段流

for-loop - for 循环括号内的两个分号

r - R 和 Stata 中全局变量的危险示例

xml - XSL递归轴故障?

xml - JavaCC:如何从标记中排除字符串? (又名理解 token 歧义。)

java - 将文件中的字符串值解析为 float ,其中字符串包含逗号

java - 我的方法一直说我需要返回一个字符串,但我的方法有一个返回字符串的返回语句