2010-06-11 3 views
2

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

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[" со строками, но опять не повезло.

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

+0

Чтобы получить форматирование кода (что позволяет '<' и т. Д.) Встроенный в абзац, вы можете использовать backquotes (как в моем редактировании) – AakashM

ответ

4

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

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

Если вы хотите, чтобы на нем была разметка CDATA , вам необходимо явно указать сериализатору, чтобы сделать это. Некоторые примеры того, как это сделать, - here.

+0

Это похоже на наиболее вероятное решение. Кажется странным, что я не могу взять CDATA из App.Config и передать его прямо. Я вижу, откуда вы пришли с проблемой разметки/контента. Класс Xsd был автогенерирован, поэтому немного сложнее, чем обычно, назначать узел как [XmlIgnore] (рекомендуемый метод в указанной вами ссылке), но, надеюсь, он должен работать нормально. Спасибо за предложение! – Smallgods

0

Вы пробовали изменения

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

в

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