C# 将复杂的xml反序列化为对象-创建对象的问题

C# 将复杂的xml反序列化为对象-创建对象的问题,c#,xml,deserialization,econnect,C#,Xml,Deserialization,Econnect,好的,我正在将xml文档反序列化为对象。 基本上,我的xml文档如下所示: <?xml version="1.0"?> <root> <eConnect CUSTNMBR="22222" DATE1="1900-01-01T00:00:00" TABLENAME="RM00101" DBNAME="BOLT" Requester_DOCTYPE="Customer" ACTION="0"> <Customer>

好的,我正在将xml文档反序列化为对象。 基本上,我的xml文档如下所示:

<?xml version="1.0"?>
<root>
    <eConnect CUSTNMBR="22222" DATE1="1900-01-01T00:00:00" TABLENAME="RM00101" DBNAME="BOLT" Requester_DOCTYPE="Customer" ACTION="0">
        <Customer>
            <CUSTNMBR>22222</CUSTNMBR>
            <ADDRESS1>123 ABC St</ADDRESS1>
            <ADDRESS2/>
            <ADDRESS3/>
            <ADRSCODE>PRIMARY</ADRSCODE>
            <CITY>Ann Arbor</CITY>
            <CNTCPRSN/>
            <COUNTRY>USA</COUNTRY>
            <CPRCSTNM/>
            <CURNCYID/>
            <CUSTCLAS/>
            <CUSTDISC>0</CUSTDISC>
            <CUSTNAME>Test Customer 2</CUSTNAME>
            <PHONE1>4165551234</PHONE1>
            <PHONE2/>
            <PHONE3/>
            <FAX/>
            <PYMTRMID/>
            <SALSTERR/>
            <SHIPMTHD/>
            <SLPRSNID/>
            <STATE>Micigan</STATE>
            <TAXSCHID/>
            <TXRGNNUM/>
            <UPSZONE/>
            <ZIP>45612</ZIP>
            <STMTNAME>Test Customer 2</STMTNAME>
            <SHRTNAME>Test Customer 2</SHRTNAME>
            <PRBTADCD>PRIMARY</PRBTADCD>
            <PRSTADCD>PRIMARY</PRSTADCD>
            <STADDRCD>PRIMARY</STADDRCD>
            <CHEKBKID/>
            <CRLMTTYP>0</CRLMTTYP>
            <CRLMTAMT>0.00000</CRLMTAMT>
            <CRLMTPER>0</CRLMTPER>
            <CRLMTPAM>0.00000</CRLMTPAM>
            <RATETPID/>
            <PRCLEVEL/>
            <MINPYTYP>0</MINPYTYP>
            <MINPYDLR>0.00000</MINPYDLR>
            <MINPYPCT>0</MINPYPCT>
            <FNCHATYP>0</FNCHATYP>
            <FNCHPCNT>0</FNCHPCNT>
            <FINCHDLR>0.00000</FINCHDLR>
            <MXWOFTYP>0</MXWOFTYP>
            <MXWROFAM>0.00000</MXWROFAM>
            <COMMENT1>test comment</COMMENT1>
            <COMMENT2>another test</COMMENT2>
            <USERDEF1/>
            <USERDEF2/>
            <TAXEXMT1/>
            <TAXEXMT2/>
            <BALNCTYP>0</BALNCTYP>
            <STMTCYCL>5</STMTCYCL>
            <BANKNAME/>
            <BNKBRNCH/>
            <FRSTINDT>1900-01-01T00:00:00</FRSTINDT>
            <INACTIVE>0</INACTIVE>
            <HOLD>0</HOLD>
            <CRCARDID/>
            <CRCRDNUM/>
            <CCRDXPDT>1900-01-01T00:00:00</CCRDXPDT>
            <KPDSTHST>1</KPDSTHST>
            <KPCALHST>1</KPCALHST>
            <KPERHIST>1</KPERHIST>
            <KPTRXHST>1</KPTRXHST>
            <CREATDDT>2015-11-27T00:00:00</CREATDDT>
            <MODIFDT>2015-11-27T00:00:00</MODIFDT>
            <Revalue_Customer>1</Revalue_Customer>
            <Post_Results_To>0</Post_Results_To>
            <FINCHID/>
            <GOVCRPID/>
            <GOVINDID/>
            <DISGRPER>0</DISGRPER>
            <DUEGRPER>0</DUEGRPER>
            <DOCFMTID/>
            <Send_Email_Statements>0</Send_Email_Statements>
            <GPSFOINTEGRATIONID/>
            <INTEGRATIONSOURCE>0</INTEGRATIONSOURCE>
            <INTEGRATIONID/>
            <Address>
                <CUSTNMBR>22222</CUSTNMBR>
                <ADRSCODE>PRIMARY</ADRSCODE>
                <SLPRSNID/>
                <UPSZONE/>
                <SHIPMTHD/>
                <TAXSCHID/>
                <CNTCPRSN/>
                <ADDRESS1>123 ABC St</ADDRESS1>
                <ADDRESS2/>
                <ADDRESS3/>
                <COUNTRY>USA</COUNTRY>
                <CITY>Ann Arbor</CITY>
                <STATE>Micigan</STATE>
                <ZIP>45612</ZIP>
                <PHONE1>4165551234</PHONE1>
                <PHONE2/>
                <PHONE3/>
                <FAX/>
                <GPSFOINTEGRATIONID/>
                <INTEGRATIONSOURCE>0</INTEGRATIONSOURCE>
                <INTEGRATIONID/>
                <Internet_Address/>
            </Address>
        </Customer>
    </eConnect>
</root>
    [XmlRoot("root")]
    public class eConnect
    {
        public Customer customer;
    }

    public class Customer
    {
        public string CUSTNMBR { get; set; }
        public string CUSTNAME { get; set; }

    }
我得到异常是因为我必须为xml文档中的所有节点提供变量吗?有没有办法只使用我需要的节点


我创建类的方法也是正确的,因为基本上xml将有一个名为root的根节点,根节点可以包含多个eConnect节点,但每个eConnect节点只包含一个customer节点

尝试在类中添加Serializable属性,并在类中使用XmlElement标记来定义对象的映射方式。我也会为你的根创建一个单独的类

[XmlRoot("root")]
[Serializable]
public class Root
{
    public Root() 
    {
        eConnects = new List<eConnect>();
    }

    [XmlElement("eConnect")]
    public List<eConnect> eConnects { get; set; }
}

[XmlRoot("eConnect")]
[Serializable]
public class eConnect
{
    [XmlElement("Customer")]
    public Customer customer { get; set; }
}

[XmlRoot("Customer")]
[Serializable]
public class Customer
{
    [XmlElement("CUSTNMBR")]
    public string CUSTNMBR { get; set; }
    [XmlElement("CUSTNAME")]
    public string CUSTNAME { get; set; }

}


使用Visual Studio的“将XML粘贴为类”功能

要执行此操作:
打开Visual Studio>编辑菜单>粘贴特殊内容>将XML粘贴为类。

生成的类可能需要清理(例如,将类型从ushort更改为int等)。此功能处理序列化所需的属性。以下是xml的一个示例:

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class root
{

    private rootEConnect eConnectField;

    /// <remarks/>
    public rootEConnect eConnect
    {
        get
        {
            return this.eConnectField;
        }
        set
        {
            this.eConnectField = value;
        }
    }
}

// Intermediate Xml nodes ...

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class rootEConnectCustomer
{

    private ushort cUSTNMBRField;

    private string aDDRESS1Field;

    private object aDDRESS2Field;

    private object aDDRESS3Field;

    private string aDRSCODEField;

    // rest of class ...
}
//
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(“代码”)]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace=”“,IsNullable=false)]
公共部分类根
{
私有rootEConnect econnect字段;
/// 
公共根连接
{
得到
{
返回此.econnect字段;
}
设置
{
this.eConnectField=值;
}
}
}
//中间Xml节点。。。
/// 
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute(“代码”)]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
公共部分类rootEConnectCustomer
{
私人ushort cUSTNMBRField;
专用字符串地址1字段;
私有对象地址2字段;
私有对象地址3字段;
私有字符串aDRSCODEField;
//其他同学。。。
}

您希望
公共客户
成为属性而不是字段。但是,不确定这是否是您唯一的问题。您有三层标记:root、eConnect、Customer,但您的类只有两层:root、Customer。XMLRoot和类名应该是相同的。为什么不使用这里概述的技术:?我想您需要在
类的
eConnects
属性上使用
public
(对于
XmlSerializer
。@steve16351您是对的,我只是忘了键入:)它现在已经修复。非常感谢,这解决了我的问题!
[XmlElement("CUSTNAME")]
public string CustomerName { get; set; }
/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace = "", IsNullable = false)]
public partial class root
{

    private rootEConnect eConnectField;

    /// <remarks/>
    public rootEConnect eConnect
    {
        get
        {
            return this.eConnectField;
        }
        set
        {
            this.eConnectField = value;
        }
    }
}

// Intermediate Xml nodes ...

/// <remarks/>
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType = true)]
public partial class rootEConnectCustomer
{

    private ushort cUSTNMBRField;

    private string aDDRESS1Field;

    private object aDDRESS2Field;

    private object aDDRESS3Field;

    private string aDRSCODEField;

    // rest of class ...
}