XML CDATA Encoding

8

我正在尝试使用C#构建带有CDATA的XML文档,以保存元素内的文本。例如..

我在C#中尝试构建一个带有CDATA的XML文档来保存元素内的文本。例如:
<email>
<![CDATA[test@test.com]]>
</email>

然而,当我获取文档的InnerXml属性时,CDATA已被重新格式化,因此InnerXml字符串看起来像下面这样,导致失败。
<email>
&lt;![CDATA[test@test.com]]&gt;
</email>

如何在访问XML字符串时保留原始格式?
祝好

请展示一下你是如何构建文档的。我怀疑你只是将文本节点设置为"<![CDATA[test@test.com]]>",这就是为什么它被转义的原因。 - Jon Skeet
我确实是...使用XmlNode的InnerText属性。我应该使用什么? - Nick
3个回答

12

不要使用InnerText,而要使用XmlDocument.CreateCDataSection

using System;
using System.Xml;

public class Test
{
    static void Main()
    {
        XmlDocument doc = new XmlDocument();
        XmlElement root = doc.CreateElement("root");
        XmlElement email = doc.CreateElement("email");
        XmlNode cdata = doc.CreateCDataSection("test@test.com");

        doc.AppendChild(root);
        root.AppendChild(email);
        email.AppendChild(cdata);

        Console.WriteLine(doc.InnerXml);
    }
}

谢谢Jon!我也遇到了同样的问题。 - Hallaghan

9
使用XmlDocument
    XmlDocument doc = new XmlDocument();
    XmlElement email = (XmlElement)doc.AppendChild(doc.CreateElement("email"));
    email.AppendChild(doc.CreateCDataSection("test@test.com"));
    string xml = doc.OuterXml;

或者使用 XElement
    XElement email = new XElement("email", new XCData("test@test.com"));
    string xml = email.ToString();

1
新的X*类很棒!XCData甚至可以将字符串分解成多个CDATA元素,这些元素会将其打破(在其中唯一保留的序列是:“]]>”)。例如:new XCData("]]>blah") 输出 <![CDATA[]]]]><![CDATA[>blah]]>,其中“]]”在一个CDATA元素中,“>”在另一个CDATA元素中。 - patridge

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接