如何使xsd2code创建XmlArrayAttribute和XmlArrayItemAttribute而不需要额外的类

时间:2012-10-24 13:29:25

标签: c# xsd xsd2code

我有一个xsd,我想看看某种方式序列化。我可以通过以下方式实现我想要的但问题是,xsd2code会生成一个在任何地方都完全未使用的额外类。我做错了吗?我还缺少另一种技巧吗?

<xsd:schema 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
elementFormDefault="qualified" >

    <xsd:element name="UITranslatorConfiguration" >
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="Queries" minOccurs="0" />
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="Queries">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element ref="Query" minOccurs="0" maxOccurs="unbounded"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>

    <xsd:element name="Query">
        <xsd:complexType>
            <xsd:simpleContent>
                <xsd:extension base="xsd:string">
                    <xsd:attribute name="QueryID" type="xsd:string" />
                </xsd:extension>
            </xsd:simpleContent>
        </xsd:complexType>
    </xsd:element>

</xsd:schema>

我想要的xml输出:

<UITranslatorConfiguration>
    <Queries>
        <Query QueryID="queryID1">someQueryText</Query>
        <Query QueryID="queryiq2">someQueryText2</Query>
        <Query QueryID="queryiq3">someQueryText3</Query>
    </Queries>
<UITranslatorConfiguration>

它生成的代码:

这很好:

[System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "3.4.0.38968")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class UITranslatorConfiguration {

    [EditorBrowsable(EditorBrowsableState.Never)]
    private List<Query> queriesField;

    private static System.Xml.Serialization.XmlSerializer serializer;

    public UITranslatorConfiguration() {
        this.queriesField = new List<Query>();
    }

    [System.Xml.Serialization.XmlArrayAttribute(Order=0)]
    [System.Xml.Serialization.XmlArrayItemAttribute("Query", IsNullable=false)]
    public List<Query> Queries {
        get {
            return this.queriesField;
        }
        set {
            this.queriesField = value;
        }
    }
}

这很好:

[System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "3.4.0.38968")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class Query {

    [EditorBrowsable(EditorBrowsableState.Never)]
    private string queryIDField;

    [EditorBrowsable(EditorBrowsableState.Never)]
    private string valueField;

    private static System.Xml.Serialization.XmlSerializer serializer;

    [System.Xml.Serialization.XmlAttributeAttribute()]
    public string QueryID {
        get {
            return this.queryIDField;
        }
        set {
            this.queryIDField = value;
        }
    }

    [System.Xml.Serialization.XmlTextAttribute()]
    public string Value {
        get {
            return this.valueField;
        }
        set {
            this.valueField = value;
        }
    }
}

这不太好。这是从哪里来的?为什么?它根本不用于任何地方。如何使xsd2code不生成此类。

[System.CodeDom.Compiler.GeneratedCodeAttribute("Xsd2Code", "3.4.0.38968")]
[System.SerializableAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)]
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)]
public partial class Queries {

    [EditorBrowsable(EditorBrowsableState.Never)]
    private List<Query> queryField;

    private static System.Xml.Serialization.XmlSerializer serializer;

    public Queries() {
        this.queryField = new List<Query>();
    }

    [System.Xml.Serialization.XmlElementAttribute("Query", Order=0)]
    public List<Query> Query {
        get {
            return this.queryField;
        }
        set {
            this.queryField = value;
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我对生成的代码有类似的“问题”(例如,丑陋的字段名称等)。我最终创建了漂亮而干净的实体类,并使用AutoMapper从生成的类中的数据初始化它们。这意味着我不必直接处理生成的类,它还提供了anti corruption layer。即使生成的类具有世界上最漂亮的代码,这也是我的建议,只是为了保护您的应用程序免受模式中任何意外更改的影响。

但是,我刚刚在我的xsd2code版本中测试了这个(3.5.3直接从源代码构建了一些额外的修补程序以修复我遇到的各种问题),并确认此行为仍然存在发生。我建议你在xsd2code site打开一个问题,但遗憾的是似乎没有太多关注修复它们(我已经提交了几个尚未实现的补丁),所以我不指望很快修复。谢天谢地,你已经能够解决它。

答案 1 :(得分:0)

您的架构包含显式“查询”元素。这导致了类的生成。要实现不带“Queries”类的代码集,只需将Queries元素的类型指定为type =“Query”。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="XMLSchema1"
    targetNamespace="http://tempuri.org/XMLSchema1.xsd"
    elementFormDefault="qualified"
    xmlns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:mstns="http://tempuri.org/XMLSchema1.xsd"
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
>

  <xs:element name="UITranslatorConfiguration">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="Queries" type="Query" minOccurs="0" maxOccurs="unbounded"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>

  <xs:complexType name="Query">
    <xs:simpleContent>
      <xs:extension base="xs:string">
        <xs:attribute name="QueryID" type="xs:string"/>
      </xs:extension>
    </xs:simpleContent>
  </xs:complexType>

</xs:schema>

这将产生所需的结果,如图所示

namespace Schemas1
{
    using System;
    using System.Diagnostics;
    using System.Xml.Serialization;
    using System.Collections;
    using System.Xml.Schema;
    using System.ComponentModel;
    using System.Collections.Generic;


    public partial class UITranslatorConfiguration
    {

        private List<Query> queriesField;

        public UITranslatorConfiguration()
        {
            this.queriesField = new List<Query>();
        }

        public List<Query> Queries
        {
            get
            {
                return this.queriesField;
            }
            set
            {
                this.queriesField = value;
            }
        }
    }

    public partial class Query
    {

        private string queryIDField;

        private string valueField;

        public string QueryID
        {
            get
            {
                return this.queryIDField;
            }
            set
            {
                this.queryIDField = value;
            }
        }

        [System.Xml.Serialization.XmlTextAttribute()]
        public string Value
        {
            get
            {
                return this.valueField;
            }
            set
            {
                this.valueField = value;
            }
        }
    }
}

根据我将xsd文件转换为自动生成的类(无论使用哪种工具)的经验,我发现最好避免在可能的情况下使用“ref”,而是在这些情况下直接使用类型。

希望这有帮助。