Библиотека Java, чтобы избежать / очистить XML? - PullRequest
2 голосов
/ 13 декабря 2011

Я получаю ввод неправильного текста в формате 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 ]

6 голосов
/ 13 декабря 2011

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

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

2 голосов
/ 13 декабря 2011

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

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

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

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

1 голос
/ 13 декабря 2011

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

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

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

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

0 голосов
/ 13 декабря 2011

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

0 голосов
/ 13 декабря 2011

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

...