使用 R 和 xml2 库提取嵌套 XML 数据

Sha*_*Way 2 r xml2

我有以下信息作为嵌套 XML 文件,我试图将其转换为 data.frame 以进行分析和报告:

<node TEXT="Cost">
  <node TEXT="Scale">
    <node TEXT="1 - $0 to $100">
    </node>
    <node TEXT="2 - $100 to $500">
    </node>
    <node TEXT="3 - $500 to $1000">
    </node>
    <node TEXT="4 - $1000 to $5000">
    </node>
    <node TEXT="6 - $5000 +">
    </node>
  </node>
  <node TEXT="Weight">
    <node TEXT="1">
    </node>
  </node>
</node>
Run Code Online (Sandbox Code Playgroud)

我能够读取 XML 文件并提取一小部分,如下所示:

file <- '<node TEXT="Cost">
  <node TEXT="Scale">
    <node TEXT="1 - $0 to $100">
    </node>
    <node TEXT="2 - $100 to $500">
    </node>
    <node TEXT="3 - $500 to $1000">
    </node>
    <node TEXT="4 - $1000 to $5000">
    </node>
    <node TEXT="6 - $5000 +">
    </node>
  </node>
  <node TEXT="Weight">
    <node TEXT="1">
    </node>
  </node>
</node>
'

data <- read_xml(file)

xml_find_all(data,"//node/node[@TEXT = 'Scale']/node/@TEXT")
Run Code Online (Sandbox Code Playgroud)

但我真正需要做的是以 data.frame 的形式获取它,如下所示:

Node1  Node2    Node3
"Cost" "Scale"  "1 - $0 to $100"
"Cost" "Scale"  "2 - $100 to $500"
"Cost" "Scale"  "3 - $500 to $1000"
"Cost" "Scale"  "4 - $1000 to $5000"
"Cost" "Scale"  "5 - $5000 +"
"Cost" "Weight" "1"
Run Code Online (Sandbox Code Playgroud)

有人能指出我正确的方向吗?

MrF*_*ick 5

xslt您也可以只迭代节点列表,而不是使用。这里我们选择所有三层深度的节点,然后从所有父节点中提取 TEXT 属性(最后用 绑定在一起dplyr

library(dplyr)
xml_find_all(doc,"//node/node/node") %>% lapply(function(x) {
    list(
      NODE1=x %>% xml_parent %>% xml_parent %>% xml_attr("TEXT"),
      NODE2=x %>% xml_parent %>% xml_attr("TEXT"),
      NODE3=x %>% xml_attr("TEXT")
    )
}) %>% bind_rows()
Run Code Online (Sandbox Code Playgroud)