【问题标题】:Working with XML nodes in "R"在“R”中使用 XML 节点
【发布时间】:2014-11-28 12:40:20
【问题描述】:

给定以下 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 节点“A”的列表。我可以这样做

node_a <- xpathSApply(doc = xmlobj, path = "//A", xmlChildren)

结果(node_a)如下所示:

  [,1] [,2]
B ?    ?   
C ?    ?   

在第二步中,我想在步骤 1 中提取的列表中的每个 XML 节点上调用一个函数,返回一个 XML 节点列表“D”。我试图从第一步获取列表中第一个“A”元素的“C”子元素:

xmlChildren(asXMLNode(node_a["C",1]))

但是结果是:

named list()
attr(,"class")
[1] "XMLNodeList"

最后,我想分别为每个 A 获取 D 值(ID 为 1 的 A 的 D 值列表和 ID 为 2 的 A 的 D 值列表)。

或者换句话说,我想获得一个列表,其中包含 ID 为 1 的元素 A 的所有 D 元素的值,以及另一个列表,其中包含 ID 为 2 的元素 A 的所有 D 元素的值。

【问题讨论】:

    标签: xml r xpath


    【解决方案1】:

    调用问题开头的xml文本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
    

    【讨论】:

    • 非常感谢,看起来很不错!也许这是一个愚蠢的问题,但你能告诉我如何从 xml 文件中获取 XML 文本到变量“xmlText”吗?
    • 您可以只使用文件名或 url 并留下asText=FALSE。另外,read this.
    【解决方案2】:

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

    node_a <- xpathSApply(doc = xmlobj, path = "//D", xmlValue, trim = TRUE)
    
    > node_a
    [1] "10" "20" "30" "50"
    

    【讨论】:

    • 问题是我希望 D 的值被包含它们的 A 拆分。例如,我只想获得第一个或第二个 A 元素(ID 为 1 或 ID 为 2)的 D 值。所以我尝试了以下方法: node_a
    • 使用getNodeSet返回子节点,然后应用sapply(getNodeSet(xmlobj, "//A"), xpathSApply, ".//D", xmlValue)等函数
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-29
    相关资源
    最近更新 更多