Недопустимые символы в XML

На данный момент я работаю с некоторыми XML.

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

This is a string 

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

 This is a string & so is this 

Это неверно из-за того,

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

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

Единственными недопустимыми символами являются & , < и > (а также атрибуты " или ' ).

Они избегают использования объектов 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, ""); } 

Предполагаемые символы:

 & < > " ' 

http://xml.silmaril.ie/specials.html

Еще один простой способ избежать потенциально нежелательных символов 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="&amp;" 

для перевода всех & -знаков, которые не указаны; к правильным.

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

  • Как импортировать XML с вложенными узлами (родительские / дочерние отношения) в Access?
  • получить номер строки для XElement здесь
  • JAXB: требуется префикс пространства имен для всех элементов
  • Использование JAXB для перекрестных ссылок XmlID из двух XML-файлов
  • SOAP или REST для веб-служб?
  • Использование пользовательского шрифта в Android
  • Добавление существующего XML-файла с помощью XmlWriter
  • Сериализация XML и унаследованные типы
  • Создание таблицы HTML с SQL FOR XML
  • У указанного ребенка уже есть родитель. Сначала вы должны вызвать removeView () родителя ребенка
  • Как удалить недопустимые шестнадцатеричные символы из источника данных на основе XML до создания XmlReader или XPathDocument, который использует данные?
  • Давайте будем гением компьютера.