Неверные символы в XML - PullRequest
       142

Неверные символы в XML

195 голосов
/ 08 апреля 2009

Я сейчас работаю с XML.

У меня есть узлы, которые содержат строки, как показано ниже:

<node>This is a string</node>

Некоторые строки, которые я передаю узлам, будут иметь такие символы, как &, #, $ и т. Д.

<node>This is a string & so is this</node>

Это недопустимо из-за &

Я не могу обернуть эти строки в CDATA, так как они должны быть такими, какие они есть. Я попытался найти в Интернете список символов, которые нельзя поместить в узлы XML без CDATA.

Может ли кто-нибудь указать мне направление или предоставить мне список недопустимых символов?

Ответы [ 15 ]

1 голос
/ 03 декабря 2014

В процессоре Woodstox XML недопустимые символы классифицируются по этому коду

if (c == 0) {
    throw new IOException("Invalid null character in text to output");
}
if (c < ' ' || (c >= 0x7F && c <= 0x9F)) {
    String msg = "Invalid white space character (0x" + Integer.toHexString(c) + ") in text to output";
    if (mXml11) {
        msg += " (can only be output using character entity)";
    }
    throw new IOException(msg);
}
if (c > 0x10FFFF) {
    throw new IOException("Illegal unicode character point (0x" + Integer.toHexString(c) + ") to output; max is 0x10FFFF as per RFC");
}
/*
 * Surrogate pair in non-quotable (not text or attribute value) content, and non-unicode encoding (ISO-8859-x,
 * Ascii)?
 */
if (c >= SURR1_FIRST && c <= SURR2_LAST) {
    throw new IOException("Illegal surrogate pair -- can only be output via character entities, which are not allowed in this content");
}
throw new IOException("Invalid XML character (0x"+Integer.toHexString(c)+") in text to output");

Источник от здесь

1 голос
/ 18 сентября 2014

Для Java-пользователей Apache имеет служебный класс (StringEscapeUtils), который имеет вспомогательный метод escapeXml, который можно использовать для экранирования символов в строке с использованием сущностей XML.

0 голосов
/ 24 октября 2018

В итоге, допустимые символы в тексте:

  • табуляция, перевод строки и возврат каретки;
  • допустимы все неконтролирующие символы , кроме & и <; </li>
  • > недопустимо, если следует]].

Разделы 2.2 и 2.4 спецификации XML дают подробный ответ:

Символы

Юридическими символами являются табуляция, возврат каретки, перевод строки и юридические символы Unicode и ISO / IEC 10646

Символьные данные

Символ амперсанда (&) и левая угловая скобка (<) не должны появляются в их буквальном виде, за исключением случаев, когда они используются в качестве разделителей разметки, или внутри комментария, инструкции по обработке или раздела CDATA. Если они нужны в другом месте, они должны быть экранированы с использованием любого числового ссылки на символы или строки "&" и "<" соответственно. Правая угловая скобка (>) может быть представлена ​​с помощью строка ">", и для совместимости должна быть экранирована с использованием либо ">" или ссылка на символ, когда он появляется в строке "]]> "в содержании, когда эта строка не отмечает конец CDATA раздел.

0 голосов
/ 23 марта 2018

Кто-нибудь пробовал это System.Security.SecurityElement.Escape(yourstring)? Это заменит недопустимые символы XML в строке их действительным эквивалентом

0 голосов
/ 17 июня 2013

Для XSL (в действительно ленивые дни) я использую:

capture="&amp;(?!amp;)" capturereplace="&amp;amp;"

, чтобы перевести все & -signs, которые не следуют за вами; к правильным.

У нас есть случаи, когда ввод находится в CDATA, но система, которая использует XML, не принимает его во внимание. Это неаккуратное исправление, будьте осторожны ...

...