xml文档作为r中叶子树的根
我试图将XML文档的树结构表示为路径列表或连接节点名称列表。例如:xml文档作为r中叶子树的根,r,xml,xml2,R,Xml,Xml2,我试图将XML文档的树结构表示为路径列表或连接节点名称列表。例如: <node id="A"> <node id = "AA"> <node id = "AAA"></node> </node> <node id = "AB"> </node> <node id = "AC"> </node> </node> 或者这个: A,
<node id="A">
<node id = "AA">
<node id = "AAA"></node>
</node>
<node id = "AB">
</node>
<node id = "AC">
</node>
</node>
或者这个:
A, AA, AAA
A, AB
A, AC
我发现了其他语言的例子:
但我不确定如何在R中迭代节点。我使用的是xml2包
有人解决了这个问题吗?询问朋友。这里有一个使用“xml2”包的解决方案。我编写此函数是为了查找每个节点上的阀门,但在您的例子中,我们只是希望识别每个节点的属性“id”。
其目的是找到所有没有子节点的顶级节点并提取它们的值,然后移动到有子节点的节点。然后递归地重复此函数,直到找到并处理了最大的子节点
library(xml2)
file<-read_xml('<node id="A">
<node id = "AA">
<node id = "AAA"></node>
</node>
<node id = "AB">
</node>
<node id = "AC">
</node>
</node>')
findchildren<-function(nodes, df){
numchild<-sapply(nodes, function(x){length(xml_children(x))})
#extract out the attribute, value and parents
xmlattr<-xml_attr(nodes[numchild==0], "id")
#xmlvalue<-xml_text(nodes[numchild==0]) #value of node
xmlpath<-sapply(nodes[numchild==0], function(x) {toString(rev(xml_attr(xml_parents(x), "id")))})
#dftemp<-data.frame(xmlattr, xmlvalue, xmlpath)
dftemp<-data.frame(xmlpath, xmlattr)
#merge results back to master df
df<-rbind(df, dftemp)
print(dim(df)) #Print statement for status
#End of recursion
if (sum(numchild)>0){
findchildren(xml_children(nodes[numchild>0]), df) }
else{ return(df)}
}
df<-data.frame()
df<-findchildren(xml_children(file), df)
apply(df, 1, toString)
库(xml2)
file以上评论中@alistaire建议的解决方案在这里有效
只需记住去掉名称空间
library( dplyr )
library( xml2 )
dat <- read_xml( "https://s3.amazonaws.com/irs-form-990/201541349349307794_public.xml" )
dat %>% xml_find_all( '//*') %>% xml_path()
# [1] "/*" "/*/*[1]"
# [3] "/*/*[1]/*[1]" "/*/*[1]/*[2]"
# [5] "/*/*[1]/*[3]" "/*/*[1]/*[3]/*[1]"
xml_ns_strip( dat )
dat %>% xml_find_all( '//*') %>% xml_path()
# [1] "/Return"
# [2] "/Return/ReturnHeader"
# [3] "/Return/ReturnHeader/ReturnTs"
库(dplyr)
库(xml2)
dat%xml\u find\u all('/*')%>%xml\u path()
# [1] "/*" "/*/*[1]"
# [3] "/*/*[1]/*[1]" "/*/*[1]/*[2]"
# [5] "/*/*[1]/*[3]" "/*/*[1]/*[3]/*[1]"
xml带(dat)
dat%>%xml\u find\u all('/*')%>%xml\u path()
#[1]“/返回”
#[2]“/Return/ReturnHeader”
#[3]“/Return/ReturnHeader/ReturnTs”
也许xml%>%read\u-xml()%%>%xml\u-find\u-all('//*')%%>%xml\u-path()
,但它并没有完全满足您的期望。这很有效!我只是在下面发布了一个解决方案。谢谢谢谢这对于理解如何在节点集上应用函数以及如何基于属性进行选择非常有帮助。聪明的递归也是如此。请参见上面的简单解决方案。
library( dplyr )
library( xml2 )
dat <- read_xml( "https://s3.amazonaws.com/irs-form-990/201541349349307794_public.xml" )
dat %>% xml_find_all( '//*') %>% xml_path()
# [1] "/*" "/*/*[1]"
# [3] "/*/*[1]/*[1]" "/*/*[1]/*[2]"
# [5] "/*/*[1]/*[3]" "/*/*[1]/*[3]/*[1]"
xml_ns_strip( dat )
dat %>% xml_find_all( '//*') %>% xml_path()
# [1] "/Return"
# [2] "/Return/ReturnHeader"
# [3] "/Return/ReturnHeader/ReturnTs"