Как анализировать плохо сформированный XML в Java?

У меня есть XML, который мне нужно проанализировать, но не иметь никакого контроля над созданием. К сожалению, это не очень строгий XML и содержит такие вещи, как:

<mytag>This won't parse & contains an ampersand.</mytag>

В классах javax.xml.stream это совсем не нравится, и по правде говоря, ошибка:

javax.xml.stream.XMLStreamException: ParseError at [row,col]:[149,50]
Message: The entity name must immediately follow the '&' in the entity reference.

Как я могу обойти это? Я не могу изменить XML, поэтому, я думаю, мне нужен терпимый к ошибкам парсер.

Мое предпочтение было бы для исправления, которое не требует слишком большого нарушения существующего кода парсера.

Ответ 1

Если это недействительный XML (например, выше), то никакой парсер XML не будет обрабатывать его (как вы определили). Если вы знаете объем ошибок (например, вышеупомянутую проблему с сущностью), самым простым решением может быть запуск процесса исправления по нему (фиксация объектов, таких как вставка объектов), а затем передача его в существующий парсер.

В противном случае вам придется самостоятельно закодировать их со встроенной поддержкой таких аномалий. И я не могу поверить в это, кроме утомительной и подверженной ошибкам задачи.

Ответ 2

Используйте библиотеки, такие как tidy или tagsoup.

TagSoup, SAX-совместимый синтаксический анализатор, написанный на Java, который вместо синтаксического анализа корректного XML обрабатывает HTML, как он встречается в дикой природе: бедных, скверных и жестоких, хотя довольно часто далеки от коротких.

Ответ 3

Я считаю, что JSoup может обрабатывать плохо сформированный XML