Недопустимые символы в XML
На данный момент я работаю с некоторыми XML.
У меня есть узлы, которые содержат строки, как показано ниже:
This is a string
Некоторые строки, которые я передаю узлам, будут иметь символы типа &, #, $ и т. Д.
- Как использовать XPath в документах xml, имеющих пространство имен по умолчанию
- Объединение XML-документов
- Есть ли разница между «действительным xml» и «хорошо сформированным xml»?
- Каковы наилучшие методы для версий XML-схем?
- Чтение встроенного XML-файла c #
This is a string & so is this
Это неверно из-за того,
Я не могу обернуть эти строки в CDATA, поскольку они должны быть такими, какие они есть. Я попытался найти в Интернете список символов, которые нельзя поместить в узлы XML, не будучи в CDATA.
Может ли кто-нибудь указать мне в сторону одного или предоставить мне список незаконных символов?
- Был найден недопустимый символ XML (Unicode: 0xc)
- Ошибка десериализации Xml в Object - xmlns = '' не ожидалось
- Преобразование xml в строку с помощью jQuery
- Как анализировать XML с помощью анализатора SAX
- В чем разница между XML-схемой и DTD?
- Заменить динамический контент в XML-файле
- Нормализация в DOM-анализе с помощью java - как это работает?
- Каков самый быстрый способ объединить два xml-файла в один
Единственными недопустимыми символами являются &
, <
и >
(а также атрибуты "
или '
).
Они избегают использования объектов XML , в этом случае вы хотите &
для &
.
На самом деле, вы должны использовать инструмент или библиотеку, которая пишет XML для вас и абстрагирует эту вещь для вас, поэтому вам не нужно беспокоиться об этом.
Список допустимых символов приведен в спецификации XML :
Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
Итак, давайте разделим вопрос (1) символов, которые вообще недействительны в любом XML-документе, и (2) символы, которые необходимо экранировать:
Ответ, предоставленный @dolmen Invalid Characters в XML, по-прежнему действителен, но нуждается в обновлении с помощью спецификации XML 1.1.
1. Недопустимые символы.
Описанные здесь символы – это все символы, которые разрешено вставлять в документ XML.
1.1. В XML 1.0
- Ссылка: см. Рекомендацию XML 1.0, §2.2. Символы
Глобальный список допустимых символов:
[2] Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
В принципе, управляющие символы и символы из диапазонов Unicode не разрешены. Это также означает, что вызов, например, символьного объекта запрещено.
1.2. В XML 1.1
- Ссылка: см. Рекомендацию XML 1.1, §2.2. Символы и 1.3 Обоснование и список изменений для XML 1.1
Глобальный список допустимых символов:
[2] Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] /* any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. */
[2a] RestrictedChar ::= [#x1-#x8] | [#xB-#xC] | [#xE-#x1F] | [#x7F-#x84] | [#x86-#x9F]
Этот пересмотр рекомендации XML расширил допустимые символы, поэтому управляющие символы разрешены и учитывают новую версию стандарта Unicode, но они все еще не разрешены: NUL (x00) , xFFFE , xFFFF …
Однако использование управляющих символов и неопределенного символа Unicode не рекомендуется.
Также можно заметить, что все парсеры не всегда учитывают это, и документы XML с контрольными символами могут быть отклонены.
2. Символы, которые необходимо экранировать (для получения хорошо сформированного документа):
<
Должен быть экранирован с помощью <
сущность, так как предполагается, что это начало тега.
&
Должно быть экранировано с помощью &
сущность, так как предполагается, что это начало ссылки на сущность
>
Должен быть экранирован с помощью >
организация. Это не обязательно - это зависит от контекста, но настоятельно рекомендуется избегать этого.
'
Следует '
entity - обязательный атрибут, определенный в одинарных кавычках, но настоятельно рекомендуется всегда избегать его.
"
Необходимо избегать« сущности », обязательной для атрибутов, определенных в двойных кавычках, но настоятельно рекомендуется всегда избегать ее.
Это код C # для удаления недопустимых символов XML из строки и возврата новой допустимой строки.
public static string CleanInvalidXmlChars(string text) { // From xml spec valid chars: // #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF] // any Unicode character, excluding the surrogate blocks, FFFE, and FFFF. string re = @"[^\x09\x0A\x0D\x20-\uD7FF\uE000-\uFFFD\u10000-\u10FFFF]"; return Regex.Replace(text, re, ""); }
Еще один простой способ избежать потенциально нежелательных символов XML / XHTML в C #:
WebUtility.HtmlEncode(stringWithStrangeChars)
В дополнение к ответу кейта, если вы хотите сбежать с помощью блока CDATA.
Если вы поместите свой текст в блок CDATA, вам не нужно использовать экранирование . В этом случае вы можете использовать все символы в следующем диапазоне :
Примечание. Кроме того, вам не разрешено использовать последовательность символов ]]>
. Потому что это будет соответствовать концу блока CDATA.
Если все еще есть недопустимые символы (например, управляющие символы), то, вероятно, лучше использовать какую-то кодировку (например, base64).
Этот ответ сработал для меня
string code = Regex.Replace(item.Code, @"[\u0000-\u0008,\u000B,\u000C,\u000E-\u001F]", "");
Подробности в этой ссылке в блог
Для людей Java Apache имеет class утилиты (StringEscapeUtils), который имеет вспомогательный метод escapeXml, который может использоваться для экранирования символов в строке с использованием объектов XML.
В процессоре Woodstox XML недопустимые символы classифицируются по этому коду
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");
Источник отсюда
Другой способ удалить неправильные XML-символы в C # с помощью метода XmlConvert.IsXmlChar (доступного с .NET Framework 4.0)
public static string RemoveInvalidXmlChars(string content) { return new string(content.Where(ch => System.Xml.XmlConvert.IsXmlChar(ch)).ToArray()); }
или вы можете проверить, что все символы являются действительными.
public static bool CheckValidXmlChars(string content) { return content.All(ch => System.Xml.XmlConvert.IsXmlChar(ch)); }
.Net Fiddle – https://dotnetfiddle.net/v1TNus
Например, символ вертикальной вкладки (\ v) недопустим для XML, он действителен UTF-8, но недействителен XML 1.0, и даже многие библиотеки (включая libxml2) пропускают его и молча выводят недопустимый XML.
ampersand (&) is escaped to & double quotes (") are escaped to " single quotes (') are escaped to ' less than (<) is escaped to < greater than (>) is escaped to >
В C # используйте System.Security.SecurityElement.Escape или System.Net.WebUtility.HtmlEncode, чтобы избежать этих незаконных символов.
string xml = "it's my \"node\" & i like it 0x12 x09 x0A 0x09 0x0A "; string encodedXml1 = System.Security.SecurityElement.Escape(xml); string encodedXml2= System.Net.WebUtility.HtmlEncode(xml); encodedXml1 "<node>it's my "node" & i like it 0x12 x09 x0A 0x09 0x0A <node>" encodedXml2 "<node>it's my "node" & i like it 0x12 x09 x0A 0x09 0x0A <node>"
Кто-нибудь пробовал этот System.Security.SecurityElement.Escape(yourstring)
? Это заменит недопустимые символы XML в строке с их действительным эквивалентом
Для XSL (в действительно ленивые дни) я использую:
capture="&(?!amp;)" capturereplace="&"
для перевода всех & -знаков, которые не указаны; к правильным.
У нас есть случаи, когда вход в CDATA, но система, использующая XML, не учитывает ее. Это небрежное исправление, будьте осторожны …