XmlWriter экранирует только один вид цитаты
Вопрос
Вот немного кода на C #:
var sb = new StringBuilder();
var w = XmlWriter.Create(sb);
w.WriteStartElement("hello");
w.WriteAttributeString("target", "world ' \" !");
w.WriteEndElement();
w.Flush();
// then look at sb.ToString()
Я получаю строку, которая выглядит следующим образом:
<?xml version="1.0" encoding="utf-16"?><hello target="world ' " !" />
Это только избежание двойной кавычки, а не одиночной кавычки. Но документы для XmlWriter.WriteAttributeString (String, String) говорят:
Если значение атрибута включает двойные или одинарные кавычки, они заменено на & amp; quot; и & amp; соответственно. р>
Есть ли какой-то флаг, который мне нужно установить, чтобы заставить его делать то, что говорят документы?
Решение
Если вы используете .Net Reflector для просмотра кода, вы обнаружите, что вызывается метод System.Xml.XmlTextEncoder.Write (string). Вот код интереса:
if (!this.inAttribute || (this.quoteChar != ch))
this.textWriter.Write('\'');
else
this.WriteEntityRefImpl("apos");
При записи значения атрибута одинарная кавычка не экранируется, так как в этом нет необходимости. Только при написании текстового элемента "& amp; apos;" используется.
Другие советы
Это не ошибка в XmlWriter
, это ошибка в вашей прежней системе.
Если вы посмотрите на определение AttValue
в рекомендации XML 1.0, вы увидите, что XmlWriter
делает именно то, что должен делать: если значение атрибута ограничено апострофами, значение атрибута может содержать кавычки, а если оно разделено кавычками, значение атрибута может содержать апострофы.
Вы, возможно, могли бы извлечь класс из XmlTextWriter
и переопределить его методы WriteAttributes
и WriteAttributeString
. Это может сработать. Однако, если вы это сделаете, остерегайтесь пространств имен и кодировки.