使用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的了解有限,所以如果有人知道怎么做,我会很感激一些见解......
最佳托马斯
答案 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
我希望它会对你有所帮助。