2016-05-24 3 views
0

Я пытаюсь написать некоторый код, чтобы возвращать значения данного элемента в XML-фиде. Следующий код работает для всех фидов, кроме uk_legislation_feed. Может ли кто-нибудь дать мне подсказку, почему это может быть и как решить проблему? Благодарю.xpathSApply не найти нужный узел

library(XML) 

uk_legislation_feed <- c("http://www.legislation.gov.uk/new/data.feed", "xml", "//title") 
test_feed <- c("https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Frestaurants.xml", "xml", "//zipcode") 
ons_feed <- c("https://www.ons.gov.uk/releasecalendar?rss", "xml", "//title") 

read_data <- function(feed) { 
    if (feed[2] == "xml") { 
    if (!file.exists(feed[1])) download.file(feed[1], "tmp.xml", "curl") 
    dat <- xmlRoot(xmlTreeParse("tmp.xml", useInternalNodes = TRUE)) 
    } 
    titles <- xpathSApply(dat, feed[3], xmlValue) 

    return(titles) 
} 
+0

это пространство имен – hrbrmstr

+0

Вы определяете функцию, но тогда не использовать его? –

ответ

3

В связи с необъявленным пространством имен в uk_legislation_feed (в частности, не XMLNS префикс) http://www.w3.org/2005/Atom, узлы не будет должным образом не отображается. Следовательно, вам нужно будет объявить пространство имен в URI и использовать его в выражении XPath:

url <- "http://www.legislation.gov.uk/new/data.feed" 
webpage <- readLines(url) 

file <- xmlParse(webpage) 
nmsp <- c(ns="http://www.w3.org/2005/Atom") 

titles <- xpathSApply(file, "//ns:title", xmlValue, 
         namespaces = nmsp) 
titles 

# [1] "Search Results" 

# [2] "The Air Navigation (Restriction of Flying) (RNAS Culdrose) (Amendment) \ 
#  Regulations 2016" 
... 
+0

Спасибо. Очень часто, когда я пытаюсь напрямую вытащить xml (это тоже не сработало в этом случае, мне пришлось сначала загрузить файл). Я получаю сообщение об ошибке, что документ пуст или не является xml. Почему это? –

+0

Отлично! См. Edit с помощью 'readLines()' – Parfait

+0

Это потрясающе. Спасибо. –

Смежные вопросы