2017-05-26 46 views
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。我目前的解決方案非常緩慢,如果我有很多文件,也許有人可以建議一些更快的解決方案。

回答

1

可能有更好的方法從文檔中獲取xpath的完整列表,但這裏有一個解決方案。 (也有可能是更好的方法,通過XML文檔進行迭代來得到你想要的東西,但你要求所有的XPath的列表):

library(XML) #This may work in xml2 but i usually stick with XML 

#read document into R and select root 
myXML <- xmlTreeParse("myXML.xml", useInternal = TRUE) 
top <- xmlRoot(myXML) 
#convert XML to list of lists 
temp <- xmlToList(top) 

#use names of recusive apply to get list of recusive steps through XML 
temp <- unique(names(rapply(test, summary, how="unlist"))) 
#remove the last item created by summary function 
temp <- unique(sub("\\.[^.]*$", "", temp)) 
#remove attributes 
temp <- unique(sub("..attrs", "", temp)) 
#sub . for/to create xpath 
temp <- sub("\\.","/", temp) 
#add/to start the xpath at the docuemnt root 
XPaths <- paste0("/", temp) 
+0

這不會有一些奇怪的命名空間的工作,就如何任何想法處理這些? – Vitalijs

+0

你可以拿出奇怪的命名空間,如果你可以發佈一個例子,我可能會幫助...但是,你想要做什麼?有可能有更好的方法來做到這一點。 –

+0

@事情如下,我有.xml,我不知道結構我想要的是提取所有可能的字段! – Vitalijs

相關問題