关于从 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 表达式,则不能一概而论。有人会认为我可以直接sapply
通过 xpath 调用,
Cs <- sapply(N, xpathSApply, "<some_xpath_xpr>", xmlValue))
但是瞧!这根本不像我们想的那样——xpathSApplyxmlInternalDocument
每次都访问整体,而不仅仅是它给出的 xml 节点。尝试遵循文档中显示的技巧进行子集化,
N1 = xmlDoc(N[[1]])
xpathSApply(N1, ...)
free(N1)
里面sapply
只是要求一个段错误....
有什么提示吗?也许我对这一切都错了?