XPath查询用于子集节点对

3
关于在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调用进行处理,
Cs <- sapply(N, xpathSApply, "<some_xpath_xpr>", xmlValue))

但是,瞧!这并不完全是我们想要的——xpathSApply每次访问的是整个xmlInternalDocument,而不仅仅是它所给出的xml节点。试图按照文档中展示的子集技巧进行跟踪。
N1 = xmlDoc(N[[1]])
xpathSApply(N1, ...)
free(N1)

sapply里面只是在请求段错误(segfault)……”“有什么提示吗?也许我做错了?”
1个回答

2
问题很可能是你的"<some_xpath_expr>"看起来像"//C"。它需要是".//C"。句点在开头表示从当前位置开始,即N中的每个节点。顺便说一句,不再需要使用free()。我会更新文档。感谢指出这一点。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接