С# XmlWriter в StringBuilder HTML-сущности

В настоящее время я добавляю новый узел в файл XML. Поскольку узел должен быть немного динамичным, я создал StringBuilder и использую XmlWriter для создания узла:

StringBuilder newDateXML = new StringBuilder();
XmlWriter newDateXMLWriter = XmlWriter.Create(newDateXML, xmlWriterSettings);
newDateXMLWriter.WriteStartElement("Dates");
newDateXMLWriter.WriteElementString("type", "UNDEFINED");
newDateXMLWriter.WriteElementString("value", "YYYYMMDD");
newDateXMLWriter.WriteStartElement("additionalDateFields");
newDateXMLWriter.WriteStartElement("AdditionalDateFields");
newDateXMLWriter.WriteAttributeString("order", "1");
newDateXMLWriter.WriteElementString("type", "Original Type");
newDateXMLWriter.WriteElementString("value", "Date Added");
newDateXMLWriter.WriteEndElement();
newDateXMLWriter.WriteEndElement();
newDateXMLWriter.WriteEndElement();
newDateXMLWriter.Flush();

Всякий раз, когда я хочу добавить узел, я использую их, чтобы заменить нужное значение и добавить его в файл:

x4.Add(newDateXML.ToString().Replace("YYYYMMDD", dictionary[x3.Element("value").Value]));

где x4 — это XElement, а x3 — это XElement, содержащий мое значение поиска.

Проблема в том, что я считаю, что добавление их в виде строки превращает мой '>' в < и '>' в > ;

Чтобы исправить это, я попытался заменить их следующим образом:

foreach (XElement x in currentXML.Descendants("NameAddressRecord"))
{
    newXML.WriteRaw(x.ToString().Replace("&lt;", "<").Replace("&gt;", ">"));
}

Но я столкнулся с проблемой, когда некоторые другие данные на самом деле используют эти символы, и их преобразование нарушает целостность XML. Есть ли способ легко заменить это значение без потери форматирования XML и без необходимости воссоздавать этот узел каждый раз, когда я хочу его использовать?


person Tony Trozzo    schedule 11.09.2012    source источник
comment
Linq2Xml   -  person L.B    schedule 12.09.2012


Ответы (3)


Вы можете использовать XElement.Parse(), чтобы получить правильное форматирование:

x4.Add(XElement.Parse(newDateXML.ToString().Replace("YYYYMMDD", "20120908")));

Я попробовал это в LinqPad, и, похоже, это правильно.

person zykorex    schedule 11.09.2012

Вы можете попробовать использовать WriteCData

Псевдо:

newXml.WriteStartElement(x)
newXml.WriteCData(mySTringToStore)
newXml.WriteEndElement
person Roland    schedule 11.09.2012

Да, вам нужно написать это как Cdatastring. Любая вещь, включенная в CDATA, анализатор игнорирует. поэтому любой код или значения javascript, подобные тем, которые вы упомянули, должны быть в разделе CDATA.

person Praveen    schedule 11.09.2012