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-selectors を虐待するようなものです。

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 に答える