Вопрос

Вот немного кода на 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) говорят:

  

Если значение атрибута включает двойные или одинарные кавычки, они   заменено на & 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 . Это может сработать. Однако, если вы это сделаете, остерегайтесь пространств имен и кодировки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top