使用XML和R有效地获取具有特定名称的子项数

时间:2013-04-11 12:05:13

标签: xml r xpath xml-parsing

使用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表达式在一次调用中实现。我对XPATH的了解有限,所以如果有人知道怎么做,我会很感激一些见解......

最佳托马斯

3 个答案:

答案 0 :(得分: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)

(你可以测试它们here

答案 1 :(得分:1)

library(XML)
doc <- xmlTreeParse(
  system.file("exampleData", "mtcars.xml", package="XML"),
  useInternalNodes=TRUE      )
xpathApply(xmlRoot(doc),path="count(//variable)",xmlValue)

答案 2 :(得分:0)

考虑MiMo

提到的例子
<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>

获取/ path / to / node

下的子项数
library(XML)
doc = xmlParse("filename", useInternalNodes = TRUE)
rootNode = xmlRoot(doc)
childnodes = xpathSApply(rootNode[[1]][[1]], ".//NAME", xmlChildren)
length(childnodes)
[1] 3

它会给你3个,类似于得到第二个节点下的孩子数,只需相应地传递索引,

childnodes = xpathSApply(rootNode[[1]][[2]], ".//NAME", xmlChildren)
length(childnodes)
[1] 2

我希望它会对你有所帮助。