Библиотека Java, чтобы избежать / очистить XML?

Я получаю неправильный ввод текста в формате XML, например:

"<Tag>something</Tag> 8 > 3, 2 < 3, ... <Tag>something</Tag>"

Я хочу очистить вход, чтобы получить:

"<Tag>something</Tag> 8 &gt; 3, 2 &lt; 3, ... <Tag>something</Tag>"

То есть экранируйте эти специальные символы, такие как <,> и сохраняйте действительные теги ("<Tag>something</Tag>Обратите внимание, с тем же случаем)

Знаете ли вы какую-либо библиотеку Java для этого? Вероятно парсер XML / HTML? (хотя мне действительно не нужен парсер, просто "чистая" процедура)

5 ответов

Решение

JTidy - это "средство проверки синтаксиса HTML и симпатичный принтер. Как и его двоюродный брат, не являющийся Java, JTidy можно использовать в качестве инструмента для очистки искаженного и неисправного HTML"

Но это также может быть использовано с XML. Проверьте документацию. Это невероятно умно, это, вероятно, будет работать для вас.

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

Лучший подход - решить проблему до того, как вы соберете XML.

  • Если вы сгенерируете XML путем (например) разборки DOM, то анализатор позаботится о экранировании за вас.
  • Если вы генерируете XML с помощью шаблонов или разбивки строк, то вам нужно вызвать что-то вроде StringEscapeUtils.escapeXml на соответствующих кусках текста... до того, как теги XML будут включены.

Если вы оставите проблему до тех пор, пока "XML" не будет собран, она не может быть исправлена ​​должным образом.

Лучшее решение - исправить программу, генерирующую ввод текста. Самое простое такое исправление включало бы утилиту escape, как и другие предложенные ответы. Если это не вариант, я бы использовал регулярное выражение, как

</?[a-zA-Z]+ */?>

чтобы сопоставить ожидаемые теги, а затем разбить строку на теги (которые вы хотите передать без изменений) и текст между тегами (к которым вы хотите применить метод escape.)

Я бы не рассчитывал, что XML-парсер сможет сделать это за вас, потому что то, с чем вы имеете дело, не является допустимым XML. При существующем отсутствии побега это может привести к двусмысленности, поэтому вы также не сможете сделать идеальную работу.

Ознакомьтесь с XmlEscaper в Guava. Он находится в предварительной версии для версии 11, но код доступен.

Apache Commons Lang содержит класс с именем StringEscapeUtils, который делает именно то, что вы хотите! Я полагаю, вы хотите использовать метод escapeXml.

Другие вопросы по тегам