0
在XML2有可能獲得使用給定節點的XPath獲取XLL的XPath在R:使用XML2
xml_path
我不知道什麼是從給定的文檔中提取所有的XPath的最快方式。即我想查找最終節點,然後向上迭代。
在本質上我試圖做到這一點:
library(xml2)
#Read
doc <- read_xml("http://www.w3schools.com/xml/plant_catalog.xml")
#Define a funciton to extract all xpaths:
extract_all_paths<-function(x){
if (xml_length(x)==0){
final_vector<-xml_path(x)
} else{
final_vector<-list("vector")
i<-1
while (length(x)!=0){
x<-do.call(c,lapply(x,xml_children))
x_length<-sapply(x,xml_length)
final_vector[[i]]<-x[x_length==0]
x<-x[x_length!=0]
i<-i+1
}
final_vector<-do.call(c,final_vector)
final_vector<-sapply(final_vector,xml_path)
final_vector
}
final_vector
}
#Function to extract everything for a given xpath:
function_extract_values<-function(x,y){
paste(xml_text(xml_find_all(y,x)),collapse="&&&&")
}
format_file<-function(x){
x<-xml_ns_strip(x)
data_path<-data.table(x=xml_children(x))
data_xpath<-data_path[,extract_all_paths(x),by=1:nrow(data_path)]
data_xpath[,V1:=gsub("\\[(.*?)\\]","",data_xpath$V1)]
data_xpath<-data_xpath[!duplicated(V1)]
data_xpath[,V2:=list(list(x)),by=1:nrow(data_xpath)]
data_xpath[,value:=function_extract_values(V1,V2[[1]]),by=1:nrow(data_xpath)]
data_xpath[,V1:=gsub("\\/","_",V1)]
data_names<-data_xpath$V1
data_xpath[,V1:=NULL]
data_xpath[,nrow:=NULL]
data_xpath[,V2:=NULL]
data_xpath<-transpose(data_xpath)
setnames(data_xpath,data_names)
data_xpath
}
data<-format_file(doc)
在本質上我想分析的.xml文件,然後把它作爲一行到data.table。我目前的解決方案非常緩慢,如果我有很多文件,也許有人可以建議一些更快的解決方案。
這不會有一些奇怪的命名空間的工作,就如何任何想法處理這些? – Vitalijs
你可以拿出奇怪的命名空間,如果你可以發佈一個例子,我可能會幫助...但是,你想要做什麼?有可能有更好的方法來做到這一點。 –
@事情如下,我有.xml,我不知道結構我想要的是提取所有可能的字段! – Vitalijs