publicId 和 systemId 之间需要空格,但 XML 看起来没问题
White spaces are required between publicId and systemId, but XML looks OK
我刚刚拿出了几个月前写的一段代码。该代码从 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 header 数据存在一些问题,即 <!DOCTYPE ...>
。答案表明该声明具有误导性:在所描述的情况下,systemId 完全丢失,尽管错误只是抱怨它前面缺少空格。
但是,如果我使用网络浏览器获取 XML 文档,它甚至不包含 <!DOCTYPE ...>
header.
解析我几个月前检索到的 XML 文档没有问题。
如果我将今天检索到的文档与几个月前检索到的文档进行比较,则两者在根元素开始之前完全相同。
捕获 HTTP 流量终于提供了答案(未加密的连接有时会派上用场):显然,服务在过去几个月从 HTTP 切换到 HTTPS,URLs 保持不变。
对旧 URL 的请求用 301 Moved Permanently
和新 URL 回答。
当使用 java.net.URL.openStream()
从 URL 读取时,不会自动遵循重定向。因此,数据 returns 无效 XML,导致出现错误消息。
今天的经验教训:publicId 和 systemId 之间需要空格 实际上只是一种神秘的说法:[=28= 出了点问题] 您提供的数据,但我们没有费心去深入挖掘。
我刚刚拿出了几个月前写的一段代码。该代码从 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 header 数据存在一些问题,即 <!DOCTYPE ...>
。答案表明该声明具有误导性:在所描述的情况下,systemId 完全丢失,尽管错误只是抱怨它前面缺少空格。
但是,如果我使用网络浏览器获取 XML 文档,它甚至不包含 <!DOCTYPE ...>
header.
解析我几个月前检索到的 XML 文档没有问题。
如果我将今天检索到的文档与几个月前检索到的文档进行比较,则两者在根元素开始之前完全相同。
捕获 HTTP 流量终于提供了答案(未加密的连接有时会派上用场):显然,服务在过去几个月从 HTTP 切换到 HTTPS,URLs 保持不变。
对旧 URL 的请求用 301 Moved Permanently
和新 URL 回答。
当使用 java.net.URL.openStream()
从 URL 读取时,不会自动遵循重定向。因此,数据 returns 无效 XML,导致出现错误消息。
今天的经验教训:publicId 和 systemId 之间需要空格 实际上只是一种神秘的说法:[=28= 出了点问题] 您提供的数据,但我们没有费心去深入挖掘。