Прочетете като цифрови кодове вместо специални знаци

Имам XML файл, който да бъде прочетен от SAX анализатор, съхраняван в CSV и импортиран в база данни.

В моя XML файл има автор с име: <author>G&uuml;nther Heinemann</author> Както можете да видите, "ü" в XML е записано като &umml;.

И така, да, трябва да съхраня автора в база данни. Не мога да запазя този знак като "ü". Трябва да го запазя като &umml;

Но когато използвам SAX парсер за четене от XML, той продължава да чете като "ü" вместо &umml; Как мога да накарам Java да съхранява като &umml;, а не като "ü"?

Благодаря ти


person user2741620    schedule 12.10.2013    source източник
comment
възможен дубликат на SAX анализатор: Игнориране на специални знаци   -  person Ludovic Kuty    schedule 25.10.2013


Отговори (3)


Вероятно също е бавен, тъй като вероятно се чете огромен HTML DTD с включвания. Това обаче ви е необходимо, тъй като единичен амперсанд (&) не е разрешен. Този HTML DTD дефинира стотици имена на HTML обекти, като &perc; (%).

DTD може да бъде взет от XML каталог, което е офлайн локална версия за този HTML URL. След това можете да промените обектите. Но това е твърде много работа.

Това, което можете да направите, е да инсталирате свой собствен EntityHandler в анализатора и т.н. Изследователска работа, относително лесна.

Най-лесно би било да обвиете входа във вашия собствен InputStream/Reader, да речем BufferedReader, замествайки & с &amp;, което ще направи необходимите замествания.

В XML: &amp;uuml; вместо &uuml;.

line = line.replace("&", "&amp;");
// Undo XML escapes:
String[] xmlTags = { "amp", "lt", "gt", "quot", "apos" };
for (String xmlTag : xmlTags) {
    line = line.replace("&amp;" + xmlTag + ";", "&" + xmlTag + ";");
}
person Joop Eggen    schedule 12.10.2013

Използвайте Apache Commons Lang на StringEscapeUtils помощни методи escapeHtml() и unescapeHtml()

String plain = StringEscapeUtils.unescapeHtml(htmlSafe);

String htmlSafe = StringEscapeUtils.escapeHtml(plain);
person Bohemian♦    schedule 12.10.2013
comment
unescapeXml() не прави ли обратното на това, което OP иска? Бих опитал escapeHtml() вместо това. - person mzjn; 12.10.2013
comment
Всъщност не съм опитвал нищо от това лично, но според документацията escapeXml() и unescapeXml() поддържат само петте вградени XML обекта. За да превърнете ü в &uuml;, изглежда, че ще трябва да използвате escapeHtml(). - person mzjn; 12.10.2013
comment
Още нещо: в последната версия (3.1) на Apache Commons Lang забелязах някои промени в API. Например escapeHtml() се превърна в escapeHtml4(). - person mzjn; 13.10.2013

Опитайте да замените програмните файлове в променливите на средата с PROGRA~1.
person Ludovic Kuty    schedule 25.10.2013