c# - Deserialize xml to objects -
i'm trying deserialize xml objects. keep getting error:
system.invalidoperationexception' occurred in system.xml.dll additional information: xml-document (1, 1) contains error.
this class use deserialisation
[xmlroot("mrdata")] public class driverdata { [xmlelement("series")] public string series { get; set; } [xmlelement("url")] public string url { get; set; } [xmlelement("limit")] public int limit { get; set; } [xmlelement("offset")] public int offset { get; set; } [xmlelement("total")] public int total { get; set; } } [xmlroot("drivertable")] public class drivertable { [xmlelement("driver")] public list<driver> drivers { get; set; } } public class driver { [xmlelement("driverid")] public string driverid { get; set; } [xmlelement("url")] public string url { get; set; } [xmlelement("givenname")] public string givenname { get; set; } [xmlelement("familyname")] public string familyname { get; set; } [xmlelement("dateofbirth")] public datetime dateofbirth { get; set; } [xmlelement("nationality")] public string nationality { get; set; } }
i quite sure driver
, drivertable
right, maybe error in driverdata
?
class racingapiclient { public observablecollection<driverdata> getdrivers() { var url = "http://ergast.com/api/f1/drivers"; observablecollection<driverdata> drivers = new observablecollection<driverdata>(); // syncronious comsumption var syncclient = new webclient(); var content = syncclient.downloadstring(url); xmlserializer serializer = new xmlserializer(typeof(observablecollection<driverdata>)); using (textreader reader = new stringreader(url)) { drivers = ((observablecollection<driverdata>)serializer.deserialize(reader)); } return drivers; } }
this line throws error:drivers=((observablecollection<driverdata>)serializer.deserialize(reader));
the xml response is:
<?xml version="1.0" encoding="utf-8"?> <?xml-stylesheet type="text/xsl" href="http://ergast.com/schemas/mrd-1.4.xsl"?> <mrdata xmlns="http://ergast.com/mrd/1.4" series="f1" url="http://ergast.com/api/f1/drivers" limit="30" offset="0" total="833"> <drivertable> <driver driverid="abate" url="http://en.wikipedia.org/wiki/carlo_mario_abate"> <givenname>carlo</givenname> <familyname>abate</familyname> <dateofbirth>1932-07-10</dateofbirth> <nationality>italian</nationality> </driver> <driver driverid="abecassis" url="http://en.wikipedia.org/wiki/george_abecassis"> <givenname>george</givenname> <familyname>abecassis</familyname> <dateofbirth>1913-03-21</dateofbirth> <nationality>british</nationality> </driver> <driver driverid="acheson" url="http://en.wikipedia.org/wiki/kenny_acheson"> <givenname>kenny</givenname> <familyname>acheson</familyname> <dateofbirth>1957-11-27</dateofbirth> <nationality>british</nationality> </driver> <driver driverid="adams" url="http://en.wikipedia.org/wiki/philippe_adams"> <givenname>philippe</givenname> <familyname>adams</familyname> <dateofbirth>1960-11-19</dateofbirth> <nationality>belgian</nationality> </driver> <driver driverid="ader" url="http://en.wikipedia.org/wiki/walt_ader"> <givenname>walt</givenname> <familyname>ader</familyname> <dateofbirth>1912-12-15</dateofbirth> <nationality>american</nationality> </driver> <driver driverid="adolff" url="http://en.wikipedia.org/wiki/kurt_adolff"> <givenname>kurt</givenname> <familyname>adolff</familyname> <dateofbirth>1921-11-05</dateofbirth> <nationality>german</nationality> </driver> <driver driverid="agabashian" url="http://en.wikipedia.org/wiki/fred_agabashian"> <givenname>fred</givenname> <familyname>agabashian</familyname> <dateofbirth>1913-08-21</dateofbirth> <nationality>american</nationality> </driver> <driver driverid="ahrens" url="http://en.wikipedia.org/wiki/kurt_ahrens,_jr."> <givenname>kurt</givenname> <familyname>ahrens</familyname> <dateofbirth>1940-04-19</dateofbirth> <nationality>german</nationality> </driver> <driver driverid="albers" code="alb" url="http://en.wikipedia.org/wiki/christijan_albers"> <givenname>christijan</givenname> <familyname>albers</familyname> <dateofbirth>1979-04-16</dateofbirth> <nationality>dutch</nationality> </driver> <driver driverid="alboreto" url="http://en.wikipedia.org/wiki/michele_alboreto"> <givenname>michele</givenname> <familyname>alboreto</familyname> <dateofbirth>1956-12-23</dateofbirth> <nationality>italian</nationality> </driver> <driver driverid="alesi" url="http://en.wikipedia.org/wiki/jean_alesi"> <givenname>jean</givenname> <familyname>alesi</familyname> <dateofbirth>1964-06-11</dateofbirth> <nationality>french</nationality> </driver> <driver driverid="alguersuari" code="alg" url="http://en.wikipedia.org/wiki/jaime_alguersuari"> <givenname>jaime</givenname> <familyname>alguersuari</familyname> <dateofbirth>1990-03-23</dateofbirth> <nationality>spanish</nationality> </driver> <driver driverid="alliot" url="http://en.wikipedia.org/wiki/philippe_alliot"> <givenname>philippe</givenname> <familyname>alliot</familyname> <dateofbirth>1954-07-27</dateofbirth> <nationality>french</nationality> </driver> <driver driverid="allison" url="http://en.wikipedia.org/wiki/cliff_allison"> <givenname>cliff</givenname> <familyname>allison</familyname> <dateofbirth>1932-02-08</dateofbirth> <nationality>british</nationality> </driver> <driver driverid="alonso" code="alo" url="http://en.wikipedia.org/wiki/fernando_alonso"> <permanentnumber>14</permanentnumber> <givenname>fernando</givenname> <familyname>alonso</familyname> <dateofbirth>1981-07-29</dateofbirth> <nationality>spanish</nationality> </driver> <driver driverid="amati" url="http://en.wikipedia.org/wiki/giovanna_amati"> <givenname>giovanna</givenname> <familyname>amati</familyname> <dateofbirth>1962-07-20</dateofbirth> <nationality>italian</nationality> </driver> <driver driverid="amick" url="http://en.wikipedia.org/wiki/red_amick"> <givenname>red</givenname> <familyname>amick</familyname> <dateofbirth>1929-01-19</dateofbirth> <nationality>american</nationality> </driver> <driver driverid="george_amick" url="http://en.wikipedia.org/wiki/george_amick"> <givenname>george</givenname> <familyname>amick</familyname> <dateofbirth>1924-10-24</dateofbirth> <nationality>american</nationality> </driver> <driver driverid="amon" url="http://en.wikipedia.org/wiki/chris_amon"> <givenname>chris</givenname> <familyname>amon</familyname> <dateofbirth>1943-07-20</dateofbirth> <nationality>new zealander</nationality> </driver> <driver driverid="anderson" url="http://en.wikipedia.org/wiki/bob_anderson_(racing_driver)"> <givenname>bob</givenname> <familyname>anderson</familyname> <dateofbirth>1931-05-19</dateofbirth> <nationality>british</nationality> </driver> <driver driverid="andersson" url="http://en.wikipedia.org/wiki/conny_andersson"> <givenname>conny</givenname> <familyname>andersson</familyname> <dateofbirth>1939-12-28</dateofbirth> <nationality>swedish</nationality> </driver> <driver driverid="andretti" url="http://en.wikipedia.org/wiki/michael_andretti"> <givenname>michael</givenname> <familyname>andretti</familyname> <dateofbirth>1962-10-02</dateofbirth> <nationality>american</nationality> </driver> <driver driverid="mario_andretti" url="http://en.wikipedia.org/wiki/mario_andretti"> <givenname>mario</givenname> <familyname>andretti</familyname> <dateofbirth>1940-02-28</dateofbirth> <nationality>american</nationality> </driver> <driver driverid="andrews" url="http://en.wikipedia.org/wiki/keith_andrews_(driver)"> <givenname>keith</givenname> <familyname>andrews</familyname> <dateofbirth>1920-06-15</dateofbirth> <nationality>american</nationality> </driver> <driver driverid="apicella" url="http://en.wikipedia.org/wiki/marco_apicella"> <givenname>marco</givenname> <familyname>apicella</familyname> <dateofbirth>1965-10-07</dateofbirth> <nationality>italian</nationality> </driver> <driver driverid="armi" url="http://en.wikipedia.org/wiki/frank_armi"> <givenname>frank</givenname> <familyname>armi</familyname> <dateofbirth>1918-10-12</dateofbirth> <nationality>american</nationality> </driver> <driver driverid="arnold" url="http://en.wikipedia.org/wiki/chuck_arnold"> <givenname>chuck</givenname> <familyname>arnold</familyname> <dateofbirth>1926-05-30</dateofbirth> <nationality>american</nationality> </driver> <driver driverid="arnoux" url="http://en.wikipedia.org/wiki/ren%c3%a9_arnoux"> <givenname>rené</givenname> <familyname>arnoux</familyname> <dateofbirth>1948-07-04</dateofbirth> <nationality>french</nationality> </driver> <driver driverid="arundell" url="http://en.wikipedia.org/wiki/peter_arundell"> <givenname>peter</givenname> <familyname>arundell</familyname> <dateofbirth>1933-11-08</dateofbirth> <nationality>british</nationality> </driver> <driver driverid="ascari" url="http://en.wikipedia.org/wiki/alberto_ascari"> <givenname>alberto</givenname> <familyname>ascari</familyname> <dateofbirth>1918-07-13</dateofbirth> <nationality>italian</nationality> </driver> </drivertable> </mrdata>
how fix error, , return observablecollection?
you have number of issues:
you trying deserialize single
mrdata
elementobservablecollection<driverdata>
. isn't colllection. create serializer single object:xmlserializer serializer = new xmlserializer(typeof(driverdata));
you have ignored namespace
mrdata
, need changexmlroot
attribute include this:[xmlroot("mrdata", namespace = "http://ergast.com/mrd/1.4")]
drivertable
missingdriverdata
class definition. have addedxmlelement
attributes other properties. these attributes, not elements, should havexmlattribute
attributes. complete corrected definition is:[xmlroot("mrdata", namespace = "http://ergast.com/mrd/1.4")] public class driverdata { [xmlattribute("series")] public string series { get; set; } [xmlattribute("url")] public string url { get; set; } [xmlattribute("limit")] public int limit { get; set; } [xmlattribute("offset")] public int offset { get; set; } [xmlattribute("total")] public int total { get; set; } [xmlelement("drivertable")] public drivertable drivertable { get; set; } }
two properties on
driver
havexmlelement
attributes instead ofxmlattribute
attributes:[xmlattribute("driverid")] public string driverid { get; set; } [xmlattribute("url")] public string url { get; set; }
your deserializer uses
stringreader
readingurl
. uri , not content. should be:using (textreader reader = new stringreader(content))
see working example here: https://dotnetfiddle.net/bkyr7q
Comments
Post a Comment