2013-05-31 88 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()了。我会更新文档。 感谢您指出。