1

特定の方法でシリアライズしたい 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;
        }
    }
}
4

2 に答える 2

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" の使用を避け、代わりにこのような状況では型を直接使用する方がよいことがわかりました。

お役に立てれば。

于 2013-11-13T03:45:41.227 に答える
0

生成されたコードにも同様の「問題」がありました (たとえば、見苦しいフィールド名など)。最終的にはきれいなエンティティ クラスを作成し、AutoMapperを使用して、生成されたクラスのデータからそれらを初期化しました。つまり、生成されたクラスを直接処理する必要がなくなり、腐敗防止レイヤーも提供されました。生成されたクラスが世界で最も美しいコードを持っていたとしても、スキーマの予期しない変更からアプリケーションを保護するために、これをお勧めします。

ただし、私のバージョンxsd2code(ソースから直接ビルドされた 3.5.3 と、私が抱えていたさまざまな問題を修正するためのいくつかの追加パッチを適用) でこれをテストしたところ、この動作がまだ発生していることを確認しました。xsd2code サイトでイシューを開くことをお勧めしますが、残念ながら、それらを修正することにあまり重点が置かれていないようです (まだ実装されていないいくつかのパッチを提出しました)。すぐ。ありがたいことに、あなたはそれを回避することができました。

于 2012-11-23T03:15:30.383 に答える