简体   繁体   English

如何从.NET中的XSD生成强类型的.NET请求对象

[英]How to Generate Strongly Typed .NET Request Object from XSD in .NET

I've been given a number of XSD files - they are HUGE - for an insurance pricing engine, so as you can imagine, contain lots of nested complex types. 我已经得到了许多XSD文件-它们很大-用于保险定价引擎,因此可以想象,其中包含许多嵌套的复杂类型。 Person, Address, Vehicles, Car Alarm, Speeding Convictions etc etc. Here's a subset containing a single complex type: 人员,地址,车辆,汽车警报器,超速驾驶等。这是包含单个复杂类型的子集:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

    <xs:complexType name="Vehicle">
        <xs:choice maxOccurs="unbounded">
            <xs:element name="ABICode" type="ABICode" minOccurs="0"/>
            <xs:element name="ABSBrakes" type="ABSBrakes" minOccurs="0"/>
            <xs:element name="AgedOver" type="AgedOver" minOccurs="0"/>
            <xs:element name="AlarmSecurityFitted" type="AlarmSecurityFitted" minOccurs="0"/>
            <xs:element name="AlarmSecurityMake" type="AlarmSecurityMake" minOccurs="0"/>
            <xs:element name="AudioValue" type="AudioValue" minOccurs="0"/>
            <xs:element name="CarPhoneValue" type="CarPhoneValue" minOccurs="0"/>
            <xs:element name="Colour" type="Colour" minOccurs="0"/>
            <xs:element name="CountryOfManufacture" type="CountryOfManufacture" minOccurs="0"/>
            <xs:element name="CoverType" type="CoverType" minOccurs="0"/>
            <xs:element name="CurrentMileage" type="CurrentMileage" minOccurs="0"/>
            <xs:element name="Doors" type="Doors" minOccurs="0"/>
            <xs:element name="EngineSize" type="EngineSize" minOccurs="0"/>
            <xs:element name="EstimatedValue" type="EstimatedValue" minOccurs="0"/>
            <xs:element name="Finish" type="Finish" minOccurs="0"/>
            <xs:element name="FuelType" type="FuelType" minOccurs="0"/>
            <xs:element name="HasSecurity" type="HasSecurity" minOccurs="0"/>
            <xs:element name="ImmobSecurityFitted" type="ImmobSecurityFitted" minOccurs="0"/>
            <xs:element name="ImmobSecurityMake" type="ImmobSecurityMake" minOccurs="0"/>
            <xs:element name="Keeper" type="Keeper" minOccurs="0"/>
            <xs:element name="Lhd" type="Lhd" minOccurs="0"/>
            <xs:element name="Modified" type="Modified" minOccurs="0"/>
            <xs:element name="NCBCountry" type="NCBCountry" minOccurs="0"/>
            <xs:element name="NCBProtected" type="NCBProtected" minOccurs="0"/>
            <xs:element name="NCBType" type="NCBType" minOccurs="0"/>
            <xs:element name="NCBYears" type="NCBYears" minOccurs="0"/>
            <xs:element name="NightLocation" type="NightLocation" minOccurs="0"/>
            <xs:element name="Owner" type="Owner" minOccurs="0"/>
            <xs:element name="OvernightPostCode" type="OvernightPostCode" minOccurs="0"/>
            <xs:element name="PermittedDrivers" type="PermittedDrivers" minOccurs="0"/>
            <xs:element name="PricePaid" type="PricePaid" minOccurs="0"/>
            <xs:element name="PurchaseDate" type="PurchaseDate" minOccurs="0"/>
            <xs:element name="Registration" type="Registration" minOccurs="0"/>
            <xs:element name="Seats" type="Seats" minOccurs="0"/>
            <xs:element name="TrackerSecurityFitted" type="TrackerSecurityFitted" minOccurs="0"/>
            <xs:element name="TrackerSecurityMake" type="TrackerSecurityMake" minOccurs="0"/>
            <xs:element name="Transmission" type="Transmission" minOccurs="0"/>
            <xs:element name="Type" type="Type" minOccurs="0"/>
            <xs:element name="Windscreen" type="Windscreen" minOccurs="0"/>
            <xs:element name="YearManufacture" type="YearManufacture" minOccurs="0"/>
            <xs:element name="Modification" type="Modification" minOccurs="0" maxOccurs="5"/>
        </xs:choice>
    </xs:complexType>
</xs:schema>

I've successfully used xsd.exe and xsd2code to generate classes based on the schema definiitions, however, the classes that have been produced are not strongly typed, and contain arrays of Objects such as this: 我已经成功地使用xsd.exe和xsd2code生成基于架构定义的类,但是,生成的类不是强类型的,并且包含诸如此类的Objects数组:

  [System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.6.1064.2")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class Vehicle
{

    private object[] _items;

    private ItemsChoiceType4[] _itemsElementName;

    [System.Xml.Serialization.XmlElementAttribute("ABICode", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("ABSBrakes", typeof(ABSBrakes))]
    [System.Xml.Serialization.XmlElementAttribute("AgedOver", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("AlarmSecurityFitted", typeof(AlarmSecurityFitted))]
    [System.Xml.Serialization.XmlElementAttribute("AlarmSecurityMake", typeof(AlarmSecurityMake))]
    [System.Xml.Serialization.XmlElementAttribute("AudioValue", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("CarPhoneValue", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("Colour", typeof(Colour))]
    [System.Xml.Serialization.XmlElementAttribute("CountryOfManufacture", typeof(CountryOfManufacture))]
    [System.Xml.Serialization.XmlElementAttribute("CoverType", typeof(CoverType))]
    [System.Xml.Serialization.XmlElementAttribute("CurrentMileage", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("Doors", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("EngineSize", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("EstimatedValue", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("Finish", typeof(Finish))]
    [System.Xml.Serialization.XmlElementAttribute("FuelType", typeof(FuelType))]
    [System.Xml.Serialization.XmlElementAttribute("HasSecurity", typeof(HasSecurity))]
    [System.Xml.Serialization.XmlElementAttribute("ImmobSecurityFitted", typeof(ImmobSecurityFitted))]
    [System.Xml.Serialization.XmlElementAttribute("ImmobSecurityMake", typeof(ImmobSecurityMake))]
    [System.Xml.Serialization.XmlElementAttribute("Keeper", typeof(Keeper))]
    [System.Xml.Serialization.XmlElementAttribute("Lhd", typeof(Lhd))]
    [System.Xml.Serialization.XmlElementAttribute("Modification", typeof(Modification))]
    [System.Xml.Serialization.XmlElementAttribute("Modified", typeof(Modified))]
    [System.Xml.Serialization.XmlElementAttribute("NCBCountry", typeof(NCBCountry))]
    [System.Xml.Serialization.XmlElementAttribute("NCBProtected", typeof(NCBProtected))]
    [System.Xml.Serialization.XmlElementAttribute("NCBType", typeof(NCBType))]
    [System.Xml.Serialization.XmlElementAttribute("NCBYears", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("NightLocation", typeof(NightLocation))]
    [System.Xml.Serialization.XmlElementAttribute("OvernightPostCode", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("Owner", typeof(Owner))]
    [System.Xml.Serialization.XmlElementAttribute("PermittedDrivers", typeof(PermittedDrivers))]
    [System.Xml.Serialization.XmlElementAttribute("PricePaid", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("PurchaseDate", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("Registration", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("Seats", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("TrackerSecurityFitted", typeof(TrackerSecurityFitted))]
    [System.Xml.Serialization.XmlElementAttribute("TrackerSecurityMake", typeof(TrackerSecurityMake))]
    [System.Xml.Serialization.XmlElementAttribute("Transmission", typeof(Transmission))]
    [System.Xml.Serialization.XmlElementAttribute("Type", typeof(string))]
    [System.Xml.Serialization.XmlElementAttribute("Windscreen", typeof(Windscreen))]
    [System.Xml.Serialization.XmlElementAttribute("YearManufacture", typeof(string))]
    [System.Xml.Serialization.XmlChoiceIdentifierAttribute("ItemsElementName")]
    public object[] Items
    {
        get
        {
            return this._items;
        }
        set
        {
            this._items = value;
        }
    }

Ideally I would like the Vehicle class to have a number of properties which are instances of other classes so that I can use automapper to map from my domain model to the request object, serialize to XML and send the request. 理想情况下,我希望Vehicle类具有许多作为其他类实例的属性,以便可以使用自动映射器将域模型映射到请求对象,序列化为XML并发送请求。

But the way these types have been created, I have lost any information about the structure of the request object I need to build. 但是创建这些类型的方式使我失去了有关需要构建的请求对象的结构的任何信息。 Everything will need to be mapped explicitly property by property. 所有内容都需要逐个属性地显式映射。 And yet despite fiddling with all the settings in xsd2code and switches of xsd.exe I can't seem to get it to generate anything like what I want. 尽管摆弄了xsd2code中的所有设置和xsd.exe的开关,但我似乎无法使它生成类似我想要的东西。

Is there a way to do what I want, or do I need to change my approach? 有什么方法可以做我想做的事情,还是需要改变我的方法?

I've done similar work and used xsd.exe, but in this case I believe the problem is the way the schema is laid out. 我做过类似的工作并使用了xsd.exe,但是在这种情况下,我认为问题在于架构的布局方式。 The Vehicle node is an unbounded list of elements that could be any one of 40 different types of objects (ABSBrakes, AgedOver ... YearManufacture). Vehicle节点是元素的无限列表,可以是40种不同类型的对象(ABSBrakes,AgedOver ... YearManufacture)中的任何一种。 The creator of the schema hasn't left you any options other than to map them property by property. 模式的创建者除了按属性映射它们之外,没有留下任何其他选择。

I realize it's not what you want to hear, but when you come across windscreen data, create a Windscreen object and add it to Vehicle.Items and continue for each property. 我意识到这不是您想听到的,但是当您遇到挡风玻璃数据时,请创建一个挡风玻璃对象并将其添加到Vehicle.Items中,然后继续执行每个属性。 When you serialize this, it should create valid XML matching the given schema. 序列化时,它应创建与给定架构匹配的有效XML。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM