Библиотека Java, чтобы избежать / очистить XML?
Я получаю неправильный ввод текста в формате XML, например:
"<Tag>something</Tag> 8 > 3, 2 < 3, ... <Tag>something</Tag>"
Я хочу очистить вход, чтобы получить:
"<Tag>something</Tag> 8 > 3, 2 < 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.