使用“R”中的XML节点

时间:2014-11-28 12:40:21

标签: xml r xpath

给出以下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的一部分。

2 个答案:

答案 0 :(得分:1)

我不确定你想要的中间步骤,但是要获得D的值,

node_a <- xpathSApply(doc = xmlobj, path = "//D", xmlValue, trim = TRUE)

> node_a
[1] "10" "20" "30" "50"

答案 1 :(得分:1)

在问题开头xmlText

调用xml文本
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