当前位置:  开发笔记 > 编程语言 > 正文

.Net XmlSerializer:反序列化CDATA为内部文本

如何解决《.NetXmlSerializer:反序列化CDATA为内部文本》经验,为你挑选了1个好方法。

我使用标准的.Net XmlSerializer来解决CDATA反序列化问题.

更新:我从外部系统获取XML,我不能影响它的格式,所以我不能将CData包含在一个单独的属性元素中.

序列化给出了:



反序列化不会将对象恢复为原始状态.

这是正在序列化的类:

public class MyClass
{
    string _data;

    [XmlIgnore]
    public string Data
    {
        get { return _data; }
        set { _data = value; }
    }

    [XmlAnyElement]
    public XmlCDataSection CData
    {
        get { return new XmlDataDocument().CreateCDataSection(Data); }
        set { Data = value.Value; }
    }
}

这是失败的测试:

[Test]
public void CData_as_inner_text_test()
{
    MyClass item = new MyClass();

    item.Data = "Hello, world!";

    XmlSerializer serializer = new XmlSerializer(item.GetType());
    string serialized;

    using (StringWriter sw = new StringWriter())
    {
        serializer.Serialize(sw, item);
        serialized = sw.GetStringBuilder().ToString();
    }

    MyClass deserialized;

    using (StringReader sr = new StringReader(serialized))
    {
        deserialized = (MyClass)serializer.Deserialize(sr);
    }

    Assert.AreEqual(item.Data, deserialized.Data); // For some reason, deserialized.Data == null
}

我在这里发现了同样的问题,但没有答案: XmlSerializer,XmlAnyElement和CDATA



1> oefe..:

CData属性结束为null,因为CDATA部分的内容最终在Data属性中被忽略...


绝对等同于:

Hello, world!

您不应该关心外部应用程序是否将MyClass的内容写为CData.同样,外部应用程序不应该关心你如何写出来.

IOW,这应该是你所需要的:

public class MyClass
{
    string _data;

    [XmlText]
    public string Data
    {
        get { return _data; }
        set { _data = value; }
    }
}

推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有