C#XmlWriter到StringBuilder HTML实体

时间:2012-09-11 20:23:45

标签: c# xml linq-to-xml stringbuilder xmlwriter

我目前正在向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。

问题是我相信将这些字符串添加为“>”进入& lt;和'>'进入& gt;

为了解决这个问题,我尝试将它们替换出来:

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

但我遇到了一个问题,其他一些数据实际上正在使用这些符号并转换它们会破坏XML的完整性。是否有任何方法可以轻松替换此值而不会丢失XML格式,并且每次我都不需要重新使用此节点?

3 个答案:

答案 0 :(得分:2)

您可以使用XElement.Parse()来获得正确的格式:

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

我在LinqPad尝试了这一点,它似乎正在做正确的事。

答案 1 :(得分:0)

您可以尝试使用WriteCData

伪:

newXml.WriteStartElement(x)
newXml.WriteCData(mySTringToStore)
newXml.WriteEndElement

答案 2 :(得分:0)

是的,你需要把它写成Cdatastring。 CDATA中包含的任何内容,解析器都会忽略它。所以你提到的任何javascript代码或值应该在CDATA部分