CDATA returns <![CDATA 而不是 <![CDATA[

CDATA returns &lt;![CDATA instead of <![CDATA[

我在 asp.net MVC 控制器中有一个操作返回一个像这样的序列化对象。

public ActionResult Test(int ID)
{
    var xmlString= Serialize(object);

    return this.Content(xmlString, "text/xml");

}

public string Serialize<T>(T obj))
        {
            XmlSerializer ser = new XmlSerializer(typeof(T));

            XmlWriterSettings settings = new XmlWriterSettings();
            settings.Encoding = new UnicodeEncoding(false, false); // no BOM in a .NET string
            settings.Indent = true;
            settings.OmitXmlDeclaration = true;

            using (StringWriter textWriter = new StringWriter())
            {
                using (XmlWriter xmlWriter = XmlWriter.Create(textWriter, settings))
                {
                    ser.Serialize(xmlWriter, obj);
                }
                return textWriter.ToString(); 
            }
        }

其中一个元素包含 <![CDATA[ 。问题是在浏览器中我得到 <![CDATA[ ,但在文档源代码中它显示为 &lt;![CDATA

要设置 cdata 值,我正在使用新 System.Xml.XmlDocument().CreateCDataSection(tempValue).OuterXml;

可能是什么问题?

您正在使用 XmlSerializer 序列化包含文本 <![CDATA[...]]>.

的字符串

XmlSerializer 将生成 XML,可以将其反序列化以生成完全相同的字符串。

如果它产生了:

<SomeNode><![CDATA[...]]></SomeNode>

那么反序列化的值将是:

...

与原始字符串不匹配。

相反,它将产生:

<SomeNode>&lt;![CDATA[...]]&gt;</SomeNode>

这将正确反序列化。

当您使用 XmlSerializer 时,您无需担心对您的值进行编码;序列化程序将为您处理。删除使用 CreateCDataSection 的代码,让序列化程序负责正确编码您的数据。

如果需要精确控制生成的XML,那么就不要使用XmlSerializer。请改用 XmlWriterXmlDocumentXDocument