【问题标题】:White spaces are required between publicId and systemId, but XML looks OKpublicId 和 systemId 之间需要空格,但 XML 看起来没问题
【发布时间】:2020-04-17 15:46:34
【问题描述】:

我刚刚拿出几个月前写的一段代码。该代码从 Web 服务器获取 XML 文档并使用 JAXB 对其进行解析。我最后一次尝试它完美无缺;现在我遇到了一个例外:

org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 50; White spaces are required between publicId and systemId.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
    at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:121)

环顾四周,这表明 XML 标头数据存在一些问题,即<!DOCTYPE ...>。答案表明该陈述具有误导性:在所描述的情况下,systemId 完全丢失,尽管错误只是抱怨它前面缺少空格。

但是,如果我使用 Web 浏览器获取 XML 文档,它甚至不包含 <!DOCTYPE ...> 标头。

解析我几个月前检索到的 XML 文档没有问题。

如果我将今天检索到的文档与几个月前的文档进行比较,两者在根元素开始之前都是完全相同的。

【问题讨论】:

    标签: xml-parsing jaxb


    【解决方案1】:

    捕获 HTTP 流量最终提供了答案(未加密的连接有时会派上用场):显然服务在过去几个月从 HTTP 切换到 HTTPS,否则 URL 保持不变。

    使用301 Moved Permanently 和新网址回答对旧网址的请求。

    从带有java.net.URL.openStream() 的 URL 读取时,不会自动遵循重定向。因此,它返回的数据不是有效的 XML,从而导致错误消息。

    今天的经验教训:publicId 和 systemId 之间需要空格实际上只是一种神秘的说法:您提供的 XML 数据有问题,但我们没有打扰深入挖掘。

    【讨论】:

      猜你喜欢
      • 2013-04-18
      • 2015-04-14
      • 1970-01-01
      • 2021-07-20
      • 2016-02-19
      • 2018-05-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多