我是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线程,以及有关不尝试通过Web访问此DTD 的W3C的System Team Blog条目。我也将错误隔离到XML.load()方法,据我所知,这是一个Scala库方法。
我的问题:我该如何解决? 这是我的代码的副产品(从Raphael Ferreira的帖子中抄录),还是我需要在上一个线程中解决的Java特定产品的副产品,还是Scala特定产品的副产品?该调用在哪里发生,是错误还是功能?( “是我吗?是她,对吗?” )
有用。经过一些侦探工作,我可以详细了解它们的详细信息:
尝试解析开发性的RESTful接口时,我构建了解析器并得到了上面的(而不是类似的)错误。我尝试了各种参数来更改XML输出,但是得到了相同的错误。我尝试连接到一个我迅速跳动的XML文档(从界面本身开始愚蠢地抄写),并得到相同的错误。然后,我尝试连接任何东西,只是为了踢球,并得到相同(同样,可能只有相似)的错误。
我开始质疑这是源程序还是程序错误,因此我开始四处搜寻,这看起来像是一个持续存在的问题- 在同一主题上有很多Google和SO命中。不幸的是,这使我专注于错误的上游(语言)方面,而不是对源本身进行更多的下游故障排除。
快进,解析器突然对 原始 XML输出起作用。我确认服务器端还做了一些其他工作(只是一个疯狂的巧合?)。我没有早期的XML,但怀疑它与要更改的文档标识符有关。
现在,解析器可以在RESTful接口以及我可以使用的任何格式良好的XML上正常工作。在我尝试过的所有XHTML DTD(例如www.w3.org)上,它也都失败了。这与@SeanReilly的预期相反,但似乎与W3的说法保持一致。
我还是Scala的新手,因此无法确定我是否有特殊情况或典型情况。我也不能保证这个问题不会以另一种形式再次出现。除非确实使用了类似于@GClaramunt $ @ J-16 SDiZ所建议的解决方案,否则拉XHTML似乎会继续导致此错误。我真的没有资格知道这是语言问题还是解决方案的实施(可能是稍后的问题)
在最近的时间范围内,我怀疑最好的解决方案对我来说应该是确保有 可能 解析该XML源,而不是看到其他源具有相同的错误并假定该语言存在功能性问题。 。
希望这对其他人有帮助。