给出以下XML文件:
<XML>
<A>
<B>
<ID>1</ID>
</B>
<C>
<D>10</D>
<D>20</D>
</C>
</A>
<A>
<B>
<ID>2</ID>
</B>
<C>
<D>30</D>
<D>50</D>
</C>
</A>
</XML>
使用以下R代码,我可以在XML文件中读取:
library(XML)
xmlobj <- xmlTreeParse("my_file.xml", useInternalNodes = TRUE)
首先,我想获得一个XML节点列表&#34; A&#34;。我可以用
做到这一点node_a <- xpathSApply(doc = xmlobj, path = "//A", xmlChildren)
,结果(node_a)如下所示:
[,1] [,2]
B ? ?
C ? ?
在第二步中,我想在步骤1中提取的列表中的每个XML节点上调用一个函数,返回XML节点列表&#34; D&#34;。我试图让孩子们接受&#34; C&#34;对于第一个&#34; A&#34;第一步列表中的元素:
xmlChildren(asXMLNode(node_a["C",1]))
但结果是:
named list()
attr(,"class")
[1] "XMLNodeList"
最后,我想为每个A分别设置D的值(A的一个D值列表,其中ID为1,A的D值列表为ID为2)。
或者换句话说,我希望获得一个列表,其中包含所有D元素的值,这些元素是ID为1的元素A的一部分,另一个列表是所有D元素的值,它们是ID为2的元素A的一部分。
答案 0 :(得分:1)
我不确定你想要的中间步骤,但是要获得D的值,
node_a <- xpathSApply(doc = xmlobj, path = "//D", xmlValue, trim = TRUE)
> node_a
[1] "10" "20" "30" "50"
答案 1 :(得分:1)
在问题开头xmlText
,
library(XML)
xml <- xmlParse(xmlText,asText=T)
lapply(xml["//A//C"],function(node)sapply(xmlElementsByTagName(node,"D"),xmlValue))
# [[1]]
# D D
# "10" "20"
#
# [[2]]
# D D
# "30" "50"
如果你想要整数而不是字符而你不想要名字,
get.D <- function(node) unname(sapply(xmlElementsByTagName(node,"D"),function(n)as.integer(xmlValue(n))))
lapply(xml["//A//C"],get.D)
# [[1]]
# [1] 10 20
#
# [[2]]
# [1] 30 50