将xml反序列化为类对象的空部分

本文关键字:空部 对象 xml 反序列化 | 更新日期: 2023-09-27 18:11:00

我必须将一些xml反序列化为使用xsd.exe从xsd文件生成的对象类。一切都很好,但我的对象中有一部分总是空的,我不知道为什么,因为在xml中它有数据。

是xml文件:

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<jdf:root xmlns:jdf="http://www.tmp.com/jdf" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <jdf:header>
        <jdf:trace-id>string</jdf:trace-id>
        <jdf:timestamp>string</jdf:timestamp>
        <jdf:command>string</jdf:command>
        <jdf:version>string</jdf:version>
    </jdf:header>
    <even:data xmlns:even="http://tmp.com/zzz/pivot/event">
        <even:event xmlns:com="http://tmp.com/zzz/utils/components">
            <even:eventId>3</even:eventId>
            <even:distributorId>string</even:distributorId>
            <even:distributionNetworkId>string</even:distributionNetworkId>
            <even:typology>string</even:typology>
        </even:event>
    </even:data>
</jdf:root>

这是我在xsd文件中的类:

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://www.tmp.com/jdf")]
[System.Xml.Serialization.XmlRootAttribute("root", Namespace = "http://www.tmp.com/jdf", IsNullable = false)]
public partial class JdfRoot
{
    private JdfHeader headerField;
    private object dataField;
    /// <uwagi/>
    public JdfHeader header
    {
        get
        {
            return this.headerField;
        }
        set
        {
            this.headerField = value;
        }
    }

    /// <uwagi/>
    public object data
    {
        get
        {
            return this.dataField;
        }
        set
        {
            this.dataField = value;
        }
    }
}
/// <uwagi/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.0.30319.17929")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace = "http://mib.bnpp.com/cle/pivot/event")]
[System.Xml.Serialization.XmlRootAttribute("data", Namespace = "http://tmp.com/cle/pivot/event", IsNullable = false)]
public partial class T_data
{
    private EventOut eventField;
    /// <uwagi/>
    public EventOut @event
    {
        get
        {
            return this.eventField;
        }
        set
        {
            this.eventField = value;
        }
    }
}

我只留下了最重要的部分,因为完整版本很长。

将xml反序列化为类对象的空部分

您需要通过应用XmlElementAttribute:

正确设置data属性的XML命名空间。
    private T_data dataField;
    [XmlElement("data", Namespace = "http://tmp.com/zzz/pivot/event")]
    public T_data data
    {
        get
        {
            return this.dataField;
        }
        set
        {
            this.dataField = value;
        }
    }

同样,正如Richard Schneider所写,将data的类型更改为T_data。如果您将其保留为object属性,那么您的even:data元素树将被反序列化为XmlNode []数组,这可能不是您想要的。

查找和修复"XML属性反序列化为null"错误的最简单方法是在内存中创建一个该类的示例,将序列化为XML,并将输出与输入XML进行比较。通常你会发现其中的区别;通常它是一个不正确的名称空间。)

JdfRoot中的public object data改为public T_data data