【问题标题】:Error: XML Content does not seem to be XML | R 3.1.0错误:XML 内容似乎不是 XML | R 3.1.0
【发布时间】:2014-05-10 17:58:23
【问题描述】:

我正在尝试获取此 XML 文件,但无法获取。我检查了同一主题中的其他解决方案,但我无法理解。我是 R 新手。

> library(XML)
> fileURL <- "https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Frestaurants.xml"
> doc <- xmlTreeParse(fileURL,useInternal=TRUE)

错误:XML 内容似乎不是 XML:'https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Frestaurants.xml'

你能帮忙吗?

【问题讨论】:

  • 将链接粘贴到 chrome 地址栏中,并收到消息“此 XML 文件似乎没有任何与之关联的样式信息。”然后显示文档树。

标签: xml r parsing


【解决方案1】:

https 中删除s

library(XML)

fileURL<-"https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Frestaurants.xml"
doc <- xmlTreeParse(sub("s", "", fileURL), useInternal = TRUE)
class(doc)
## [1] "XMLInternalDocument" "XMLAbstractDocument"

【讨论】:

  • 我收到一个错误:Unknown IO errorfailed to load external entity
  • 好一个!为什么会这样呢? (https 破坏了 xml 读取?)
【解决方案2】:

您可以使用RCurl 获取内容,然后 XML 似乎能够处理它

library(XML)
library(RCurl)
fileURL <- "https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Frestaurants.xml"
xData <- getURL(fileURL)
doc <- xmlParse(xData)

【讨论】:

  • 感谢@jdharrison 的回复。我在输入第四行时收到以下错误消息:XData 函数错误(类型,msg,asError = TRUE):SSL 证书问题,验证 CA 证书是否正常。详细信息:错误:14090086:SSL 例程:SSL3_GET_SERVER_CERTIFICATE:证书验证失败这是什么意思?
  • @ArpanGanguli 使用xData &lt;- getURL(fileURL, ssl.verifypeer = FALSE)。该错误在omegahat.org/RCurl/FAQ.html 有深入解释
  • 应该是 omegahat.net 吗??
  • @Sean 是的,现在是 .net omegahat.net/RCurl/FAQ.html
【解决方案3】:

xmlTreeParse 不支持 https。

您可以使用getURL(来自RCurl)加载数据,然后对其进行解析。

【讨论】:

  • 换句话说,将“HTTPS”替换为“HTTP”
  • 问题是一些来源只提供https URL。
【解决方案4】:

答案是http://www.omegahat.net/RCurl/installed/RCurl/html/getURL.html。如果显示证书错误,关键是使用 ssl.verifyPeer=FALSE 和 getURL。

library (RCurl)
library (XML)
curlVersion()$features
curlVersion()$protocol
##These should show ssl and https. I can see these on windows 8.1 at least. 
##It may differ on other OSes.

temp <- getURL("https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Frestaurants.xml", ssl.verifyPeer=FALSE)
DFX <- xmlTreeParse(temp,useInternal = TRUE)

如果 libcurl 函数未显示 ssl 或 https 功能,请检查 using Rcurl with HTTPs

【讨论】:

  • 我认为现在应该是 omegahat.net
  • 更新了从 omegahat.org 到 omegahat.net 的链接基础 URL
【解决方案5】:

使用download.file 可以避免引入另一个依赖项。当 URL 以 https 开头时,以下函数也会返回 XML::xmlParse 的输出。它将文件缓存到一个临时目录,以便在 R 会话期间多次调用此函数时仅下载一次。

xml_parse <- function(xml_url){
    # Temporary copy of the xml file, valid for this R session
    xml_temp_file <- file.path(tempdir(), basename(xml_url))
    if (!file.exists(xml_temp_file)){
        print(sprintf("Downloading to %s.", xml_temp_file))
        download.file(xml_url, xml_temp_file)
    }
    return(XML::xmlParse(xml_temp_file))
}

# Example
xml_content = xml_parse("https://d396qusza40orc.cloudfront.net/getdata%2Fdata%2Frestaurants.xml")

【讨论】:

  • 我仍然得到上面提到的错误,但我可以重复这个直到它适用于每个文件。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 2012-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
相关资源
最近更新 更多