XmlWriter экранирует только один вид цитаты - PullRequest
1 голос
/ 04 марта 2009

Вот код 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 ' &quot; !" /> 

Это только избежание двойной кавычки, а не одиночной кавычки. Но документы для XmlWriter.WriteAttributeString (String, String) говорят:

Если значение атрибута включает двойные или одинарные кавычки, они заменено на & quot; и & apos; соответственно. * * 1 010

Есть ли какой-нибудь флаг, который мне нужно установить, чтобы заставить его делать то, что говорят документы?

Ответы [ 2 ]

7 голосов
/ 04 марта 2009

Если вы используете .Net Reflector для просмотра кода, вы обнаружите, что вызывается метод System.Xml.XmlTextEncoder.Write (string). Вот код интереса:

if (!this.inAttribute || (this.quoteChar != ch))
   this.textWriter.Write('\'');
else
   this.WriteEntityRefImpl("apos");

При записи значения атрибута одинарная кавычка не экранируется, поскольку в этом нет необходимости. Только при написании текстового элемента "& apos;" используется.

2 голосов
/ 04 марта 2009

Это не ошибка в XmlWriter, это ошибка в вашей прежней системе.

Если вы посмотрите на определение AttValue в рекомендации XML 1.0, вы увидите, что XmlWriter делает именно то, что и должен: может содержать кавычки, а если он разделен кавычками, значение атрибута может содержать апострофы.

Вы, возможно, могли бы получить класс из XmlTextWriter и переопределить его WriteAttributes и WriteAttributeString методы. Это может сработать. Однако, если вы это сделаете, остерегайтесь пространств имен и кодировки.

...