繁体   English   中英

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

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

我已经得到了许多XSD文件-它们很大-用于保险定价引擎,因此可以想象,其中包含许多嵌套的复杂类型。 人员,地址,车辆,汽车警报器,超速驾驶等。这是包含单个复杂类型的子集:

<?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>

我已经成功地使用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;
        }
    }

理想情况下,我希望Vehicle类具有许多作为其他类实例的属性,以便可以使用自动映射器将域模型映射到请求对象,序列化为XML并发送请求。

但是创建这些类型的方式使我失去了有关需要构建的请求对象的结构的任何信息。 所有内容都需要逐个属性地显式映射。 尽管摆弄了xsd2code中的所有设置和xsd.exe的开关,但我似乎无法使它生成类似我想要的东西。

有什么方法可以做我想做的事情,还是需要改变我的方法?

我做过类似的工作并使用了xsd.exe,但是在这种情况下,我认为问题在于架构的布局方式。 Vehicle节点是元素的无限列表,可以是40种不同类型的对象(ABSBrakes,AgedOver ... YearManufacture)中的任何一种。 模式的创建者除了按属性映射它们之外,没有留下任何其他选择。

我意识到这不是您想听到的,但是当您遇到挡风玻璃数据时,请创建一个挡风玻璃对象并将其添加到Vehicle.Items中,然后继续执行每个属性。 序列化时,它应创建与给定架构匹配的有效XML。

暂无
暂无

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

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