【发布时间】:2010-11-08 22:31:01
【问题描述】:
我是 Scala 的新手,所以我可能对此有所了解,我想知道问题是否出在我的代码上。给定 Scala 文件 httpparse,简化为:
object Http {
import java.io.InputStream;
import java.net.URL;
def request(urlString:String): (Boolean, InputStream) =
try {
val url = new URL(urlString)
val body = url.openStream
(true, body)
}
catch {
case ex:Exception => (false, null)
}
}
object HTTPParse extends Application {
import scala.xml._;
import java.net._;
def fetchAndParseURL(URL:String) = {
val (true, body) = Http request(URL)
val xml = XML.load(body) // <-- Error happens here in .load() method
"True"
}
}
使用哪个运行(URL无关紧要,这是一个玩笑的例子):
scala> HTTPParse.fetchAndParseURL("http://stackoverflow.com")
结果一成不变:
java.io.IOException: Server returned HTTP response code: 503 for URL: http://www.w3.org/TR/html4/strict.dtd
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1187)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:973)
at com.sun.org.apache.xerces.internal.impl.XMLEntityManager.startEntity(XMLEnti...
我已经看到关于 Java 的 Stack Overflow thread,以及关于不尝试通过 Web 访问此 DTD 的 W3C's System Team Blog entry。我还将错误隔离到 XML.load() 方法,据我所知,这是一个 Scala 库方法。
我的问题:我该如何解决这个问题?这是我的代码的副产品(抄自 Raphael Ferreira's post),是我需要解决的 Java 特定问题的副产品吗?就像the previous thread 一样,还是Scala 特有的?这个调用发生在哪里,是错误还是功能? (“是我吗?是她,对吧?”)
【问题讨论】:
-
您已经得到了答案,但我想评论一下 W3C 博客条目:根据 XML 规范,如果您使用 SYSTEM 标识符,那么解析器必须能够检索该内容: xml.com/axml/target.html#dt-sysid——即使它多年来没有改变。我链接到带注释的规范(Tim Bray 的创作,原始规范编辑之一),因为它对 SYSTEM 与 PUBLIC 标识符有一些很好的评论。
-
@kdgregory,但这不算,因为内容mettadore正在尝试检索不是XML。
-
仔细阅读:“网址无所谓,这是个笑话例子”;找到任何产生有效 XHTML 的网站,你都会遇到同样的问题
-
@kdgregory url 显然很重要,因为如果您查看错误消息,它正在尝试检索 html4 dtd。所以真正的页面也不是 XML。这种差异在实践中也很重要:考虑到(正如其他人指出的那样)xml 规范(而不是 html 规范)需要它,很可能会成功检索到 xhtml dtd。
-
:shrug: 当你尝试打开一个指向 "w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd" 的 URLConnection 时,它会做同样的事情;显然他们正在查看用户代理并阻止 Java API