Я работаю с некоторым XML, который содержит строки вроде:
<node>This is a string</node>
Некоторые строки , которые я передаю на узлы будут иметь символы , такие как &
, #
, $
и т.д .:
<node>This is a string & so is this</node>
Это не действительно из-за &
.
Я не могу обернуть эти строки в CDATA, поскольку они должны быть такими, какие они есть. Я попытался найти список символов, которые нельзя поместить в узлы XML, не находясь в CDATA.
Может ли кто-то указать мне в направлении одного или предоставить мне список незаконных персонажей?
Ответы:
Единственными недопустимыми символами являются
&
,<
и>
(а также"
или'
в атрибутах).Они сбежали с помощью XML - сущности , в этом случае вы хотите
&
для&
.Однако на самом деле вы должны использовать инструмент или библиотеку, которая пишет для вас XML и абстрагирует подобные вещи, чтобы вам не пришлось об этом беспокоиться.
источник
Хорошо, давайте разделим вопрос о персонажах, которые:
Ответ, предоставленный @dolmen в разделе « Что такое недопустимые символы в XML », все еще действителен, но его необходимо обновить с помощью спецификации XML 1.1.
1. Недопустимые символы
Описанные здесь символы - это все символы, которые разрешено вставлять в документ XML.
1.1. В XML 1.0
Глобальный список разрешенных символов:
В основном, управляющие символы и символы вне диапазонов Unicode не допускаются. Это также означает, что вызов, например, символьной сущности

запрещен.1.2. В XML 1.1
Глобальный список разрешенных символов:
Эта редакция рекомендации XML расширила допустимые символы, чтобы разрешить управляющие символы, и учитывает новую редакцию стандарта Unicode, но они по-прежнему недопустимы: NUL (x00) , xFFFE , xFFFF ...
Тем не менее, использование управляющих символов и неопределенного символа Unicode не рекомендуется.
Также можно заметить, что все парсеры не всегда учитывают это, и документы XML с управляющими символами могут быть отклонены.
2. Символы, которые нужно экранировать (чтобы получить правильно оформленный документ):
<
Должны быть экранированы с<
лица, так как предполагается, что начало тега.&
Должны быть экранированы с&
лица, так как предполагается, что начало ссылки объект>
Должны быть экранированы с>
лица. Это не обязательно - это зависит от контекста - но настоятельно рекомендуется избегать его.'
Должны быть экранированы с'
лица - обязательный в атрибутах , определенных в одинарные кавычки , но настоятельно рекомендуется всегда избежать."
Должны быть экранированы с"
лица - обязательный в атрибуты , определенные в двойных кавычках , но настоятельно рекомендуется всегда избежать.источник
Список допустимых символов находится в спецификации XML :
источник
& < > " '
в определенных контекстах их следует экранировать.Это код C # для удаления недопустимых символов XML из строки и возврата новой допустимой строки.
источник
\u10000
и\u10FFFF
как отдельные символы, так как они требуют двухchar
экземпляров utf-16 каждый, и, согласно документам, может быть не более 4 цифр.[\u10000-\u10FFFF]
скорее всего , анализируются как [\u1000
,0-\u10FF
,F
,F
] , который является странным , но законно.Предварительно объявленные символы:
См. « Какие специальные символы в XML? » Для получения дополнительной информации.
источник
В дополнение к ответу Потаме, если вы хотите сбежать с помощью блока CDATA.
Если вы поместите свой текст в блок CDATA, вам не нужно использовать экранирование . В этом случае вы можете использовать все символы в следующем диапазоне :
Примечание. Кроме того, вы не можете использовать
]]>
последовательность символов. Потому что это будет соответствовать концу блока CDATA.Если все еще есть недопустимые символы (например, управляющие символы), то, вероятно, лучше использовать какую-то кодировку (например, base64).
источник
Другой простой способ избежать потенциально нежелательных символов XML / XHTML в C #:
источник
Другой способ удаления неправильных символов XML в C # - использование
XmlConvert.IsXmlChar
(доступно с .NET Framework 4.0)или вы можете проверить, что все символы допустимы в XML:
.Net Fiddle
Например, символ вертикальной табуляции (
\v
) недопустим для XML, он является допустимым UTF-8, но не верным XML 1.0, и даже многие библиотеки (включая libxml2) пропускают его и без вывода сообщений выводят недопустимый XML.источник
В итоге, допустимые символы в тексте:
&
и<
.>
не действует, если следующее]]
.Разделы 2.2 и 2.4 спецификации XML дают подробный ответ:
Персонажи
Данные персонажа
источник
« XmlWriter и нижние символы ASCII » работали для меня
источник
В C # используйте
System.Security.SecurityElement.Escape
или,System.Net.WebUtility.HtmlEncode
чтобы избежать этих недопустимых символов.источник
Для Java-пользователей Apache имеет служебный класс (
StringEscapeUtils
), который имеет вспомогательный метод,escapeXml
который можно использовать для экранирования символов в строке с использованием сущностей XML.источник
В XML-процессоре Woodstox недопустимые символы классифицируются этим кодом:
Источник отсюда
источник
Кто-нибудь пробовал это
System.Security.SecurityElement.Escape(yourstring)
? Это заменит недопустимые символы XML в строке их действительным эквивалентом.источник
Для XSL (в действительно ленивые дни) я использую:
переводить все & -signs, которые не следуют за вами; к правильным.
У нас есть случаи, когда входные данные находятся в CDATA, но система, которая использует XML, не принимает это во внимание. Это небрежное решение, остерегайтесь ...
источник