Как сделать так, чтобы xpathSApply выводил вектор длины узлов, используя xmlAttrs? - PullRequest
3 голосов
/ 07 ноября 2011

Это продолжение до очень похожий вопрос Я уже задавал, но на этот раз я пытаюсь получить xmlAttrs вместо xmlValue.Допустим, у нас есть следующее:

my.xml <- '
<tv>
  <show>
    <name>Star Trek TNG</name>
    <rating>1.0</rating>
    <a href="http://www.google.com">google</a>
  </show>
  <show>
    <name>Doctor Who</name>
    <a href="http://www.google.com">google</a>
  </show>
  <show>
    <name>Babylon 5</name>
    <rating>2.0</rating>
  </show>
</tv>
'
library(XML)
doc <- xmlParse(my.xml)
xpathSApply(doc, '/tv/show', function(x) xmlValue(xmlChildren(x)$a))
# [1] "google" "google" NA 

Я бы предпочел вывод

# [1] "http://www.google.com" "http://www.google.com" NA 

Однако я просто не могу понять это.Я думал, что это может быть что-то вроде этого, но я ошибся:

xpathSApply(doc, '/tv/show', function(x) xmlAttrs(xmlChildren(x)$a))
# Error in UseMethod("xmlAttrs", node) : 
# no applicable method for 'xmlAttrs' applied to an object of class "NULL"

Самое близкое, что я получил это:

xpathSApply(doc, '/tv/show', function(x) xmlChildren(x)$a)
# [[1]]
# <a href="http://wwww.google.com">google</a> 
#
# [[2]]
# <a href="http://wwww.google.com">google</a> 
#
# [[3]]
# NULL

1 Ответ

5 голосов
/ 07 ноября 2011

Почти понял. Вы просто должны позаботиться о случае NULL самостоятельно, поскольку xmlAttrs() выдает эту ошибку при обнаружении значения NULL:

> xpathSApply(doc, '/tv/show', function(x) ifelse(is.null(xmlChildren(x)$a), NA, xmlAttrs(xmlChildren(x)$a, 'href')))
[1] "http://www.google.com" "http://www.google.com" NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...