c# - 如何防止 XmlSerializer 转义 "nested XML"?

标签 c# xml escaping xml-serialization xmlserializer

我正在使用 XmlSerializer 序列化/反序列化复杂对象。一个属性包含一个 XML 字符串,应该在不反序列化的情况下将其写入字符串属性。

示例(可在 LinqPad 中执行):

[XmlRoot("RootObject")]
[Serializable]
public class RootClass
{
    [XmlArray("SubObjects")]
    [XmlArrayItem("SubObject")]
    public SubClass[] SubObjecs { get; set;} 
}

[Serializable]
public class SubClass
{
    [XmlElement("XmlConfiguration")]
    public string XmlConfiguration { get; set;}
}

void Main()
{
    var obj = new RootClass()
    {
        SubObjecs = new[]
        {
            new SubClass { XmlConfiguration = "<ConfigurationX>SomeConfiguration1</ConfigurationX>" },
            new SubClass { XmlConfiguration = "<ConfigurationY>SomeConfiguration2</ConfigurationY>" }
        }
    };

    var serializer = new XmlSerializer(typeof(RootClass));
    using (var stream = new MemoryStream())
    {
        serializer.Serialize(stream, obj);
        stream.Position = 0;
        Console.WriteLine(Encoding.UTF8.GetString(stream.GetBuffer()));
    }
}

例子的输出是:

<?xml version="1.0"?>
<RootObject xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <SubObjects>
        <SubObject>
            <XmlConfiguration>&lt;ConfigurationX&gt;SomeConfiguration1&lt;/ConfigurationX&gt;</XmlConfiguration>
        </SubObject>
        <SubObject>
            <XmlConfiguration>&lt;ConfigurationY&gt;SomeConfiguration2&lt;/ConfigurationY&gt;</XmlConfiguration>
        </SubObject>
    </SubObjects>
</RootObject>

XML 是一种配置文件,有时以编程方式编写,但主要由人编写/修改。因此,XmlConfiguration 中的 XML 不应包含转义字符。

问题: 是否可以防止 XmlSerializer 转义“<”和“>”字符?如果没有,是否可以使用另一个序列化程序?

一个可行的选项是 XmlWriter.WriteRaw .但是,如果可能的话,我会避免这种不可靠且不易维护的解决方案。


我在这里发现了一个类似的问题:How to prevent XmlSerializer from escaping < and > characters .但是这个问题与 !CDATA[[Content]] 相关,我的问题没有答案。

最佳答案

正如上面在 dbc 的评论中提到的,有一个使用 XmlAnyElement 属性的解决方案,如下所述:Deserialize dynamic XML


我找到了一个混合了 XmlSerializerXmlWriter.WriteRaw 的解决方案。实现 IXmlSerializable 时,可以控制 XmlSerializer 的序列化过程。 Therfore IXmlSerializable 必须只为需要特殊处理的类实现(这对我来说没问题):

[Serializable]
public class SubClass : IXmlSerializable
{
    [XmlElement("XmlConfiguration")]
    public string XmlConfiguration { get; set; }

    public void WriteXml(XmlWriter writer)
    {
        writer.WriteStartElement("XmlConfiguration");
        writer.WriteRaw(XmlConfiguration);
        writer.WriteEndElement();
    }

    public void ReadXml(XmlReader reader)
    {
        reader.ReadToDescendant("XmlConfiguration");
        XmlConfiguration = reader.ReadInnerXml();
        reader.ReadEndElement();
    }

    public XmlSchema GetSchema()
    {
        return (null);
    }
}

关于c# - 如何防止 XmlSerializer 转义 "nested XML"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38107517/

相关文章:

bash - 有没有一种简单的方法可以将 "raw"字符串传递给 grep?

c# - 仅应用程序洞察日志异常

c# - 带有功能区的 Visual Studio 图像 (XML)

ruby - 如何制作 ruby 字符串 "\("?

xml - 编辑 .plist 文件 - 是否允许单引号作为字符串?

c# - SandcaSTLe 如何知道 vs-project 成员的可见性

c - 终止字符引用

c# - 对 Windows 服务具有 WRITE 权限而对其他应用程序只有 READ 权限的文件夹

c# - 如何在可拖动的 Canvas 上制作矩形?

c# - 下拉列表未将 SelectedIndex 发送回 ASP.NET 中的服务器