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
。
Cs <- sapply(N, xpathSApply, "<some_xpath_xpr>", xmlValue))
しかし、見よ!これは、私たちが考えていることをまったく実行しません。xpathSApply は、xmlInternalDocument
指定された xml ノードだけでなく、毎回全体にアクセスします。サブセット化のドキュメントに示されているトリックに従おうとすると、
N1 = xmlDoc(N[[1]])
xpathSApply(N1, ...)
free(N1)
内部でsapply
は、セグメンテーション違反を求めているだけです....
ヒントはありますか?多分私はこれについてすべて間違っていますか?