xpath查询子集对节点

时间:2013-05-31 23:08:16

标签: xml r xpath

关于从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都有一行,其中包含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是节点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内的

只是要求段错误。

任何提示?也许我说这一切都错了?

1 个答案:

答案 0 :(得分:1)

问题很可能是您的"<some_xpath_expr>"看起来像"//C"。 它必须是".//C"。的。在开头说从你所在的地方开始 目前是,即N中的每个节点。

顺便说一下,不再需要free()了。我会更新文档。 谢谢你指出了。