R:解析大型非结构化xml文件
我有一个非常复杂的xml文件需要在R中解析并以数据帧格式呈现。其结构可能类似于下面的示例。这些节点不是并行的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
<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)
)