关于从R
中的XML文档进行子集化的最佳方法的问题想象一下,我有一个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
都有一行,其中包含B
和C
值的列。
我不能只做
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是节点A内部的一些长xpath表达式,则不会概括。一个人会认为我只能通过xpath调用sapply
,< / p>
Cs <- sapply(N, xpathSApply, "<some_xpath_xpr>", xmlValue))
但是罗和看哪!这根本不符合我们的想法 - 每次xpathSApply访问整个xmlInternalDocument
,而不仅仅是它给出的xml节点。试图遵循文档中显示的子集化技巧,
N1 = xmlDoc(N[[1]])
xpathSApply(N1, ...)
free(N1)
sapply
内的只是要求段错误。
任何提示?也许我说这一切都错了?
答案 0 :(得分:1)
问题很可能是您的"<some_xpath_expr>"
看起来像"//C"
。
它必须是".//C"
。的。在开头说从你所在的地方开始
目前是,即N中的每个节点。