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

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

しかし、見よ!これは、私たちが考えていることをまったく実行しません。xpathSApply は、xmlInternalDocument指定された 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 に答える