2015-09-02 50 views
0

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

我离开只是因为完整版我很长的最必要的部分。

+0

哪部分总是空? – Lali

+0

零件“data”为空 – malymakar

回答

2

您需要正确地运用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; 
     } 
    } 

而且,理查德·施耐德写道,改变data类型为T_data。如果将它作为object属性留下,那么even:data元素树将被反序列化为XmlNode []数组,这可能不是您想要的。

(查找并修复“XML属性反序列化null” bug的最简单方法是在内存中创建类的实例,连载到XML,并比较你的输入XML格式的输出。通常你会发现差异;通常这是一个不正确的命名空间。)

1

JdfRoot,将public object data更改为public T_data data

+0

我试图做,但不幸的是它没有改变任何东西。 – malymakar

+0

@SteveLillis,这提供了一个答案。它可能不正确或可能不适用于原始海报,但它是一个答案。请不要将此标记为“不是答案”。如果你觉得这是一个**错误的答案,请立刻退出,不要标记。 – Andy