我有以下信息作为嵌套 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)
有人能指出我正确的方向吗?
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)