1

R とパッケージ XML を使用して、巨大な XML ファイルを解析しています。今必要なデータ処理の一部として、ノードの長いリストで、各ノードが持つ特定の名前の子の数 (ノードの数は 20.000 を超える可能性があります)

現時点での私のアプローチは次のとおりです。

nChildrenWithName <- xpathSApply(doc, path="/path/to/node/*", namespaces=ns, xmlName) == 'NAME'
nChildren <- xpathSApply(doc, path="/path/to/node", namespaces=ns, fun=xmlSize)
nID <- sapply(split(nChildrenWithName, rep(seq(along=nChildren), nChildren)), sum)

これは可能な限りベクトル化されています。それでも、正しい XPATH 式を使用して 1 回の呼び出しでこれを達成できると感じています。ただし、XPATHに関する私の知識は限られているため、その方法を知っている人がいれば、洞察に感謝します...

最高のトーマス

4

3 に答える 3

2
library(XML)
doc <- xmlTreeParse(
  system.file("exampleData", "mtcars.xml", package="XML"),
  useInternalNodes=TRUE      )
xpathApply(xmlRoot(doc),path="count(//variable)",xmlValue)
于 2013-04-11T13:36:11.980 に答える
2

質問を正しく理解していれば、次のような XML があります。

<path>
  <to>
    <node>
      <NAME>A</NAME>
      <NAME>B</NAME>
      <NAME>C</NAME>
    </node>
    <node>
      <NAME>X</NAME>
      <NAME>Y</NAME>
    </node>
  </to>
  <to>
    <node>
      <NAME>AA</NAME>
      <NAME>BB</NAME>
      <NAME>CC</NAME>
    </node>
  </to>
</path>

NAME必要なのは、各要素の下の要素の数ですnode。上記の例では、3、2、3 です。

これは XPath 1.0 では不可能です。式はノードのリストまたは単一の値を返すことができますが、計算された値のリストは返せません。

XPath 2.0 を使用すると、次のように記述できます。

for $node in /path/to/node return count($node/NAME)

または単に:

/path/to/node/count(NAME)

(ここでテストできます)

于 2013-04-11T13:58:11.210 に答える