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 表达式在单个调用中实现。不过,我对 XPATH 的了解有限,所以如果有人知道该怎么做,我将不胜感激……

最好的托马斯

4

3 回答 3

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 回答
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 回答
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

我希望它会帮助你。

于 2015-10-03T14:31:14.003 回答