Между publicId и systemId требуются пробелы, но XML выглядит нормально - PullRequest
0 голосов
/ 17 апреля 2020

Я только что вытащил кусок кода, который написал несколько месяцев go. Код извлекает документ 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 вообще отсутствовал, несмотря на ошибку, просто жаловавшуюся на пропущенный пробел перед ним.

Однако, если я получу документ XML с веб-браузер, он даже не содержит заголовка <!DOCTYPE ...>.

Анализ документа XML, который я получил несколько месяцев назад, работает без проблем.

Если я проверю документ, я найденные сегодня и несколько месяцев назад, оба одинаковы до начала элемента root.

1 Ответ

0 голосов
/ 17 апреля 2020

Захват HTTP-трафика c наконец дал ответ (незашифрованные соединения иногда бывают полезны): очевидно, служба переключалась с HTTP на HTTPS в последние несколько месяцев, а URL-адреса оставались неизменными.

На запросы к старому URL отвечают 301 Moved Permanently и новый URL.

При чтении с URL с java.net.URL.openStream() перенаправления не выполняются автоматически. Таким образом, возвращаемые данные недействительны XML, что приводит к сообщению об ошибке.

Урок, полученный на сегодняшний день: Требуются пробелы между publicId и systemId на самом деле просто крипти c способ сказать: Что-то не так с XML данными, которые вы предоставили, но мы не удосужились углубиться.

...