私は、要求と応答のための階層的なデータを階層的な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のにカップル余分同様の選択肢を追加しましたが、代わりにそれは私にアイテムを与え、占める特別項目1 、Items2 ...私は本当にそれだけの文字列を保持している独自の型の配列であることを持っている必要はありませんが、私はまた、実際にそれを残したくない
は「アイテムと呼ばれる "(xsdにTHOSEを追加する方法を知っていますか?)、より分かりやすい名前を付ける必要があります。また、Webサービススキーマの変更がXSDを変更してからクラスを再生成することが必要な場合は、必ず手動で目的のワークフローとして変更することはできません。
これは、xsd.exeがサポートしなければならないもののもう1つのようです。私は行方不明のものがありますか?何とか別のアプローチをとるべきですか?あるいは、代わりに私はこれに使用できる代替ツールがありますか?
私はこの答えを逃したかどうかはわかりません申し訳ありません - それは私の1をするために働いていました – RobS