如何从Web服务反序列化XML

时间:2013-12-02 08:35:02

标签: c# xml

我正在开发一个可以从网络服务获得汽车制造的系统。此Web服务将返回如下所示的XML文件。我想用c#将其序列化为一类汽车。然后该类将保留在我的本地数据库中。我还想使用架构中的信息。什么是完美的方式。

<xml xmlns:s='uuid:BDC6E3F0-6DA3-11d1-A2A3-00AA00C14882'
    xmlns:dt='uuid:C2F41010-65B3-11d1-A29F-00AA00C14882'
    xmlns:rs='urn:schemas-microsoft-com:rowset'
    xmlns:z='#RowsetSchema'>
<s:Schema id='RowsetSchema'>
    <s:ElementType name='row' content='eltOnly' rs:updatable='true'>
        <s:AttributeType name='MMCode' rs:number='1' rs:writeunknown='true' rs:basecatalog='Vehicles' rs:basetable='Vehicle'
             rs:basecolumn='MMCode' rs:keycolumn='true'>
            <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='8' rs:maybenull='false'/>
        </s:AttributeType>
        <s:AttributeType name='VehicleType' rs:number='2' rs:writeunknown='true' rs:basecatalog='Vehicles' rs:basetable='Vehicle'
             rs:basecolumn='Type_Code'>
            <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='1' rs:fixedlength='true' rs:maybenull='false'/>
        </s:AttributeType>
        <s:AttributeType name='Make' rs:number='3' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='Vehicles'
             rs:basetable='Make' rs:basecolumn='Name'>
            <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='50'/>
        </s:AttributeType>
        <s:AttributeType name='Variant' rs:number='4' rs:nullable='true' rs:writeunknown='true' rs:basecatalog='Vehicles'
             rs:basetable='Vehicle' rs:basecolumn='Name'>
            <s:datatype dt:type='string' rs:dbtype='str' dt:maxLength='255'/>
        </s:AttributeType>
        <s:extends type='rs:rowbase'/>
    </s:ElementType>
</s:Schema>
<rs:data>
    <z:row MMCode='00250100' VehicleType='T' Make='ACO' Variant='100 (4) ADE' Cyl='' CubicCapacity='0' Kilowatts='100'
         BodyType='' NoOfDoors='' FuelType='' FuelCapacity='' IntroDate='12/1997' DiscDate='' TareWeight='0' No_Seats='0'
         GVM='0' Co2='' Code='002' c18='00250100' Year='2013' Month='5'/>
    <z:row MMCode='00250101' VehicleType='T' Make='ACO' Variant='100 (4) ADE CAB' Cyl='' CubicCapacity='0' Kilowatts='100'
         BodyType='' NoOfDoors='' FuelType='' FuelCapacity='' IntroDate='12/1997' DiscDate='7/1999' TareWeight='0' No_Seats='0'
         GVM='0' Co2='' Code='002' c18='00250101' Year='2013' Month='5'/>
    <z:row MMCode='00250160' VehicleType='T' Make='ACO' Variant='160 (4) CAB' Cyl='' CubicCapacity='0' Kilowatts='194'
         BodyType='' NoOfDoors='' FuelType='' FuelCapacity='' IntroDate='12/1998' DiscDate='7/1999' TareWeight='0' No_Seats='0'
         GVM='0' Co2='' Code='002' c18='00250160' Year='2013' Month='5'/>
</rs:data>
</xml>

1 个答案:

答案 0 :(得分:0)

我认为,您可以使用DataSet并执行一些linq操作

DataSet ds = new DataSet();
ds.ReadXml(filename); //or ds.ReadXml(stream)

var tbl = ds.Tables.Cast<DataTable>().Last();

var rows = tbl.Rows.Cast<DataRow>()
            .Select(row => row.ItemArray)
            .Select(arr => arr.Select((item, inx) => new {item,inx })
                              .ToDictionary(y => tbl.Columns[y.inx], y => y.item))
            .ToList();