Проблема с синтаксическим анализом XML с '&' в тексте элемента - PullRequest
12 голосов
/ 01 октября 2010

У меня есть следующий код:

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;

DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuilder();
Document document = builder.parse(new InputSource(new StringReader(inputXml)));

И шаг разбора сбрасывает:

SAXParseException: The entity name must immediately follow 
                   the '&' in the entity reference

из-за следующего '&' в моем inputXml:

<Line1>Day & Night</Line1>

Я не контролирую входящий XML.Как я могу безопасно / правильно разобрать это?

Ответы [ 4 ]

35 голосов
/ 01 октября 2010

Проще говоря, ввод "XML" не является допустимым XML. Сущность должна быть закодирована, т.е.

<Line1>Day &amp; Night</Line1>

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

Если в документе вообще нет сущностей, регулярное выражение заменит & на &amp; перед обработкой. Но если они отправляют некоторые объекты правильно, вам нужно исключить их из соответствия. И в редком случае, когда они действительно захотят отправить код сущности (то есть отправил &amp;, но означал &amp;amp;), вам совершенно не повезет.

Но, эй, в любом случае это ошибка поставщика, и если ваша попытка исправить неверный ввод не совсем то, что они хотели, есть простая вещь, которую они могут сделать, чтобы решить эту проблему. : -)

5 голосов
/ 01 октября 2010

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

Вам необходимо предварительно обработать текст, прежде чем передавать его в анализатор XML.Несмотря на то, что вы можете выполнить замену строки, заменив '& ' на '&amp; ', это не поможет отловить каждое вхождение & во входных данных, но, возможно, вы сможете найти что-то, что делает.

4 голосов
/ 22 октября 2012

Я использовал Tidy framework до разбора xml

final StringWriter errorMessages = new StringWriter();
final String res = new TidyChecker().doCheck(html, errorMessages);
...
DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder();
Document doc = db.parse(new InputSource(new StringReader(addRoot(html))));  
...

и все ок

3 голосов
/ 01 октября 2010

это inputXML строка? Тогда используйте это:

inputXML = inputXML.replaceAll("&\\s+", "&amp;");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...