2013-05-31 87 views
2

問題上着手子集從XML文檔中的R的最佳方式XPath查詢的節點的子集對

想象我有一個XML文件,它在中間部分的結構是這樣的地方:

<A> 
    <B> 1 </B> 
    <C> 2 </C> 
    <D> 3 </D> 
    <E> lots of other stuff, child nodes, etc </E> 
</A> 
<A> 
    <B> 5 </B> 
    <C> 6 </C> 
    <D> 7 </D> 
    <E> lots of other stuff </E> 
</A> 
<A> 
    <B> 1 </B> 
    <D> 2 </D> 
    <E> lots of other stuff </E> 
</A> 

我想創建一個表,其中每個節點A有一行,其中BC值的列。

我不能只是做

Bs <- xpathSApply(doc, "//x:B", xmlValue, namespaces="x") 
Cs <- xpathSApply(doc, "//x:C", xmlValue, namespaces="x") 
data.frame(Bs, Cs) 

由於某些節點缺少「C」元素,因此這些載體將是不同的長度和在一般不對齊。

相反,我可以這樣做:

N <- getNodeSet(doc, "//x:A", namespaces="x") 
Bs <- sapply(N, function(x) xmlValue(x[["B"]]) 
Cs <- sapply(N, function(x) xmlValue(x[["C"]]) 

它是沒問題,當兩個節點的深度相同,但如果節點C是一些長期的XPath表達式內心深處節點A.人們可能會認爲不一概而論我可以只sapply在XPath的呼叫相反,

Cs <- sapply(N, xpathSApply, "<some_xpath_xpr>", xmlValue)) 

但你瞧!這完全不符合我們的想法--xpathSApply每次訪問整個xmlInternalDocument,而不僅僅是它給出的xml節點。試圖遵循子集文檔中所示的伎倆,

N1 = xmlDoc(N[[1]]) 
xpathSApply(N1, ...) 
free(N1) 

sapply裏面只是要求一個段錯誤....

任何提示?也許我正在解決這個問題?

回答

1

問題很可能是您的"<some_xpath_expr>"看起來像"//C"。 它需要是".//C"。這個。在開始處表示從當前所在的位置開始,即,每個節點都位於N.

順便說一句,應該不需要free()了。我會更新文檔。 感謝您指出。