0

以 XML 为例

<body>
  <items>
    <item>
      <name>Peter</name>
    </item>
  </items>
  <items>
    <item>
      <name>Paul</name>
    </item>
    <item>
      <name>Claudia</name>
    </item>
  </items>
  <items/>
</body> 

问题:获得以下结果的最简单方法是什么?

"Peter"   "Paul"   ""

现在我实现了如下:

require(rvest)
require(magrittr)
my_xml <- xml("<items><item><name>Peter</name></item></items><items><item><name>Paul</name></item><item><name>Claudia</name></item></items><items></items>")
items <- my_xml %>% xml_nodes("items") %>% xml_node("item")
sapply(items, function(x){
  if(is.null(x)){
    ""
  } else {
    x %>% xml_node("name") %>% xml_text()
  }
})

对我来说,这种sapply构造接缝就像虐待任何一个rvest或 css 选择器。

4

1 回答 1

2

rvest真的不需要,因为这是纯 XML(xml2无论如何你最终都会使用构造):

library(xml2)

doc <- read_xml("<body>
  <items>
    <item>
      <name>Peter</name>
    </item>
  </items>
  <items>
    <item>
      <name>Paul</name>
    </item>
    <item>
      <name>Claudia</name>
    </item>
  </items>
  <items/>
</body>")


sapply(xml_find_all(doc, "//items"), function(x) {
  val <- xml_text(xml_find_all(x, "./item[1]/name"))
  ifelse(length(val)>0, val, "")
})

## [1] "Peter" "Paul"  ""     

(有时 XPath 可能比 CSS 更好)

于 2015-10-01T11:30:58.880 回答