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 表达式,则不能一概而论。有人会认为我可以直接sapply通过 xpath 调用,

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

但是瞧!这根本不像我们想的那样——xpathSApplyxmlInternalDocument每次都访问整体,而不仅仅是它给出的 xml 节点。尝试遵循文档中显示的技巧进行子集化,

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

里面sapply只是要求一个段错误....

有什么提示吗?也许我对这一切都错了?

4

1 回答 1

2

问题很可能是你的"<some_xpath_expr>"样子"//C"。它需要是".//C"。这 。开头说从你当前所在的位置开始,即 N 中的每个节点。

顺便说一句,应该不再需要 free() 了。我会更新文档。感谢您指出了这一点。

于 2013-05-31T23:15:35.710 回答