2015-12-11 5 views
0

Итак, я работаю над десериализацией XML-документа в объекты. В основном мой XML-документ будет выглядеть следующим образом:Deserializing сложный 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 будет содержать только один клиентский узел.

+1

Вы хотите 'customer' госзаказчиках быть собственностью не является полем. Не уверен, что это ваша единственная проблема. – Jonesopolis

+0

У вас есть три слоя тегов: root, eConnect, Customer, но ваши классы имеют только два слоя: root, Customer. Имя XMLRoot и класс должны быть одинаковыми. – jdweng

ответ

2

Попробуйте добавить атрибут 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; } 

} 

Использование тега XmlElement также дает вам право называть ваши переменные более дружественными именами. Например, вы могли бы перейти

[XmlElement("CUSTNAME")] 
public string CUSTNAME { get; set; } 

в

[XmlElement("CUSTNAME")] 
public string CustomerName { get; set; } 
+0

Я думаю, вам нужно 'public' в свойстве' eConnects' класса 'Root' (в любом случае для' XmlSerializer'). – steve16351

+0

@ steve16351 вы правы, я просто забыл набрать его :) Это исправлено сейчас. – DHP

+0

Большое спасибо, что исправил мою проблему! – Kristen

Смежные вопросы