2009-03-18 10 views
4

私は、要求と応答のための階層的なデータを階層的なXMLの単一の文字列にパックする古代のWebサービスに接続しなければならないプロジェクトに取り組んでいます。XSDスキーマからC#コードを生成するとき、どのように配列に "Items"以外の名前を付けることができますか?

私はxsd.exeを使用してサンプル要求と応答XMLフラグメントからXSDを生成し、可能な限り最適な定義に変更し、xsd.exeを再度使用してC#オブジェクトを生成しました。 Webサービスを呼び出すマネージャは、強く型付けされたリクエストオブジェクトをパラメータとして取り込み、呼び出しを行うために文字列にシリアル化し、レスポンスを文字列として返し、強く型付けされたレスポンスオブジェクトに逆シリアル化して返すことができます。

たとえば、文字列のリストがある場合、xs:string要素の無制限xs:choiceの複合型と見なされる有効なXSDを持つことができます。次に、単純に文字列配列に逆シリアル化され、それは対処するのが素敵で簡単です。厄介な問題は何らかの理由で文字列配列を "Items"以外のものにする方法がないように見えることです。問題なし何を私はスキーマに追加する、私はxsd.exeを他の名前を書くことができない。

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="AccountStatusRequest" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xs:element name="AccountStatusRequest"> 
     <xs:complexType> 
      <xs:choice minOccurs="0" maxOccurs="unbounded" id="AccountRowIDs"> 
       <xs:element nillable="true" type="xs:string" id="AccountRowID" name="AccountRowID"/> 
      </xs:choice> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

し、得られたクラス:

public partial class AccountStatusRequest { 

    private string[] itemsField; 

    [System.Xml.Serialization.XmlElementAttribute("AccountRowID", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] 
    public string[] Items { 
     get { 
      return this.itemsField; 
     } 
     set { 
      this.itemsField = value; 
     } 
    } 
} 

私はほとんどすべてのMSDATAを追加しようとしました:ここ

は、例えば、XSDスキーマの選択と内側の要素の両方にインテリセンスで属性何も違いはありません。

ただ、議論のために、私は、文字列配列の名前を使用するように強制するかどうかを確認するために、そのcomplexTypeのにカップル余分同様の選択肢を追加しましたが、代わりにそれは私にアイテムを与え、占める特別項目1Items2 ...私は本当にそれだけの文字列を保持している独自の型の配列であることを持っている必要はありませんが、私はまた、実際にそれを残したくない

は「アイテムと呼ばれる "(xsdにTHOSEを追加する方法を知っていますか?)、より分かりやすい名前を付ける必要があります。また、Webサービススキーマの変更がXSDを変更してからクラスを再生成することが必要な場合は、必ず手動で目的のワークフローとして変更することはできません。

これは、xsd.exeがサポートしなければならないもののもう1つのようです。私は行方不明のものがありますか?何とか別のアプローチをとるべきですか?あるいは、代わりに私はこれに使用できる代替ツールがありますか?

答えて

-1

編集:私は何とか前の回答を逃した申し訳ありません - それは私のために働いた - ここで私が使用したスキーマだと結果。私の元の回答も適切かもしれません。

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="AccountStatusRequest" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xs:element name="AccountStatusRequest" msdata:ColumnName="AccountList"> 
     <xs:complexType> 
      <xs:sequence minOccurs="0" maxOccurs="unbounded" id="AccountRowIDs"> 
       <xs:element nillable="true" type="xs:string" id="AccountRowID" name="AccountRowID"/> 
      </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

public partial class AccountStatusRequest { 

    private string[] accountRowIDField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlElementAttribute("AccountRowID", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=true)] 
    public string[] AccountRowID { 
     get { 
      return this.accountRowIDField; 
     } 
     set { 
      this.accountRowIDField = value; 
     } 
    } 
} 

そこにこんにちは、私は、所望の出力(という名前の文字列配列)を生成する単純属性によって包まれたリストで選択を置き換えて、多少のスキーマを変更しました。しかし、変更されたスキーマがあなたの行っていることに適しているかどうかはわかりません。

<?xml version="1.0" encoding="utf-8"?> 
<xs:schema id="AccountStatusRequest" xmlns="" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"> 
    <xs:element name="AccountStatusRequest" msdata:ColumnName="AccountList"> 
     <xs:complexType> 
      <xs:attribute name="AccountRowIDs"> 
      <xs:simpleType id="AccountRowID" > 
       <xs:list itemType="xs:string">     
       </xs:list> 
      </xs:simpleType>  
      </xs:attribute> 
     </xs:complexType> 
    </xs:element> 
</xs:schema> 

..and Xsd.exeではでそれを実行した後、出力:ここ

が変更されたスキーマです

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "2.0.50727.3038")] 
[System.SerializableAttribute()] 
[System.Diagnostics.DebuggerStepThroughAttribute()] 
[System.ComponentModel.DesignerCategoryAttribute("code")] 
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true)] 
[System.Xml.Serialization.XmlRootAttribute(Namespace="", IsNullable=false)] 
public partial class AccountStatusRequest { 

    private string[] accountRowIDsField; 

    /// <remarks/> 
    [System.Xml.Serialization.XmlAttributeAttribute()] 
    public string[] AccountRowIDs { 
     get { 
      return this.accountRowIDsField; 
     } 
     set { 
      this.accountRowIDsField = value; 
     } 
    } 
} 
0

私はxsd.exeの制限であることを確信しています。あなたは別の方向(class => xml/xsd)でカスタム結果を得ることができますが、それはあまり役に立ちません。ごめんなさい。

7

シーケンスに選択肢を変更してみてください、と最小/最大はAccountRowID要素で発生入れ...

+1

私はこの答えを逃したかどうかはわかりません申し訳ありません - それは私の1をするために働いていました – RobS

関連する問題