Остановить экранирование тегов CDATA при записи в XML на C # - PullRequest
2 голосов
/ 11 июня 2010

Мы создаем систему, выводящую некоторые данные в схему XML.Некоторые поля в этой схеме нуждаются в сохранении их форматирования, так как конечная система будет преобразовывать их в потенциально документный макет Word.Для этого мы используем <![CDATA[Some formatted text]]> теги внутри файла App.Config, а затем помещаем это в соответствующее поле свойства в сгенерированном классе xsd.exe из нашей схемы.В идеале форматирование не должно быть проблемой, но, к сожалению, такова система.

Раздел App.Config выглядит следующим образом:

<header>
<![CDATA[Some sample formatted data]]>
</header>

Назначение данных выглядит следующим образом:

HeaderSection header = ConfigurationManager.GetSection("header") as HeaderSection;
report.header = "<[CDATA[" + header.Header + "]]>";

Наконец, вывод Xml обрабатывается следующим образом:

xs = new XmlSerializer(typeof(report));
fs = new FileStream (reportLocation, FileMode.Create);
xs.Serialize(fs, report);
fs.Flush();
fs.Close();

Теоретически это должно привести к окончательному разделу XML, содержащему информацию с тегами CDATA.Однако угловые скобки преобразуются в &lt; и &gt;

. Я рассмотрел способы отключения Outout Escaping, но пока могу найти только ссылки на листы XSLT.Я также попробовал @"<[CDATA[" со строками, но опять не повезло.

Любая помощь будет оценена!

Ответы [ 2 ]

5 голосов
/ 11 июня 2010

Вы путаете разметку с контентом.

Когда вы присваиваете строку "<![CDATA[ ... ]]>" значению, вы говорите, что это контент , который вы хотите вставить туда.XmlSerializer не пытается и не должен пытаться вывести какую-либо семантику разметки из этого содержимого и просто экранирует ее в соответствии с обычными правилами.

Если вам нужна CDATA разметка втогда вам нужно явно указать сериализатору сделать это.Вот некоторые примеры того, как это сделать: здесь .

0 голосов
/ 11 июня 2010

Вы пытались изменить

report.header = "<[CDATA[" + header.Header + "]]>";

до

report.header = "<![CDATA[" + header.Header + "]]>";
...