CDATA返回&lt;![CDATA而不是<! - [CDATA [

时间:2015-07-02 16:29:13

标签: xml asp.net-mvc 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;

可能是什么问题?

1 个答案:

答案 0 :(得分:2)

您正在使用XmlSerializer序列化包含文字<![CDATA[...]]>的字符串。

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

如果它产生:

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

然后反序列化的值将是:

...

与原始字符串不匹配。

相反,它会产生:

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

将正确反序列化。

当您使用XmlSerializer时,您不必担心编码您的值;序列化器将为您处理。删除使用CreateCDataSection的代码,让序列化程序正确处理数据编码。

如果您需要对生成的XML进行精确控制,请不要使用XmlSerializer。请改用XmlWriterXmlDocumentXDocument