1

eBay の WSDL ファイルを処理しようとしているときに、Mono の wsdl ユーティリティからこのエラーが発生しました -

( http://developer.ebay.com/webservices/latest/eBaySvc.wsdl )

$ wsdl eBaySvc.wsdl 
Web Services Description Language Utility
Mono Framework v2.0.50727.1433
Error: XmlSchema error: Ambiguous element label which is contained by -any- particle was detected: urn:ebay:apis:eBLBaseComponents:PreferenceLevel Related schema item SourceUri: file:///home/manger/projects/ebay/eBaySvc.orig.wsdl, Line 10296, Position 7.
Stack:
   at System.Xml.Schema.ValidationHandler.RaiseValidationEvent (System.Xml.Schema.ValidationEventHandler handle, System.Exception innerException, System.String message, System.Xml.Schema.XmlSchemaObject xsobj, System.Object sender, System.String sourceUri, XmlSeverityType severity) [0x00000] 
  at System.Xml.Schema.XmlSchemaObject.error (System.Xml.Schema.ValidationEventHandler handle, System.String message, System.Exception innerException, System.Xml.Schema.XmlSchemaObject xsobj, System.Object sender) [0x00000] 
  at System.Xml.Schema.XmlSchemaObject.error (System.Xml.Schema.ValidationEventHandler handle, System.String message) [0x00000]

<xs:any ... Google でソリューションを検索すると、 toで始まる要素を変更する提案が明らかになります<xs:any namespace="##other" ...。これにより、Mono の wsdl ユーティリティがファイルを処理して、そこから .cs ファイルを作成できるようになります。しかし、Web サービス ヘルパー クラス ( eBayAPIInterfaceService service = new eBayAPIInterfaceService();)をインスタンス化しようとすると、C# プログラムから実行時例外が発生します。

Unhandled Exception: System.InvalidOperationException: There was an error reflecting type 'AddDisputeRequestType'. ---> System.InvalidOperationException: There was an error reflecting field 'DetailLevel'. ---> System.InvalidOperationException: There was an error reflecting type 'DetailLevelCodeType'. ---> System.InvalidOperationException: There was an error reflecting type 'System.Object'. ---> System.InvalidOperationException: There was an error reflecting type 'AbstractResponseType'. ---> System.InvalidOperationException: There was an error reflecting field 'Errors'. ---> System.InvalidOperationException: There was an error reflecting type 'ErrorType'. ---> System.InvalidOperationException: There was an error reflecting field 'ErrorParameters'. ---> System.InvalidOperationException: There was an error reflecting type 'ErrorParameterType'. ---> System.InvalidOperationException: There was an error reflecting field 'Any'. ---> System.InvalidOperationException: The element Any has been attributed with an XmlAnyElementAttribute and a namespace '', but no name. When a namespace is supplied, a name is also required. Supply a name or remove the namespace.                                           
  at System.Xml.Serialization.XmlReflectionImporter.ImportAnyElementInfo (System.String defaultNamespace, System.Xml.Serialization.XmlReflectionMember rmember, System.Xml.Serialization.XmlTypeMapMemberElement member, System.Xml.Serialization.XmlAttributes atts) [0x00000]                                                                                            
  at System.Xml.Serialization.XmlReflectionImporter.CreateMapMember (System.Type declaringType, System.Xml.Serialization.XmlReflectionMember rmember, System.String defaultNamespace) [0x00000]                                                   
  at System.Xml.Serialization.XmlReflectionImporter.ImportClassMapping (System.Xml.Serialization.TypeData typeData, System.Xml.Serialization.XmlRootAttribute root, System.String defaultNamespace) [0x00000]                                     
  --- End of inner exception stack trace ---

ここで Mono の wsdl ツールに問題があるのでしょうか、それとも eBay の WSDL/スキーマに問題があるのでしょうか? - 私が見たいくつかのフォーラム投稿では、WSDL がスキーマと一致しないため、Mono は正しいことを行っていますが、C# から Web サービス ヘルパー クラスをインスタンス化できるように修正するにはどうすればよいですか?

ツールのバージョン:

$ wsdl Web サービス記述言語ユーティリティ Mono Framework v2.0.50727.1433

$ gmcs --version Mono C# コンパイラ バージョン 2.4.2.3

ErrorParameterType の生成コード:

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "2.0.50727.1433")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:ebay:apis:eBLBaseComponents")]
public partial class ErrorParameterType {

    private System.Xml.XmlElement[] anyField165;

    ... more class members follow ...

    /// <remarks/>
    [System.Xml.Serialization.XmlAnyElement(Namespace="")]
    public System.Xml.XmlElement[] Any {
        get {
            return this.anyField165;
        }
        set {
            this.anyField165 = value;
        }
    }
}

私の「修正」後にwsdlが生成するeBayAPIInterfaceService.csファイルはこちら

4

1 に答える 1

1

これで問題が解決するかどうかはわかりませんが、質問のxs:anyワイルドカード'#'に次の 2 つがありません。

<xs:any namespace="##other" ...
                   ↑

生成された C# コードには、次のような多くの定義が含まれています。

[System.Xml.Serialization.XmlAnyElement(Namespace="")]
public System.Xml.XmlElement[] Any {
    get {
        return this.anyFieldXXX;
    }
    set {
        this.anyFieldXXX = value;
    }
}

MSDNから:

またはオブジェクトXmlAnyElementAttributeの配列を返すフィールドに を適用します。このようなフィールドは、オブジェクトがシリアル化されているか逆シリアル化されているかに応じて、2 つの方法で使用できます。シリアル化されると、オブジェクトは XML 要素またはノードとして生成されますが、シリアル化されるオブジェクトに対応するメンバー (または複数のメンバー) がありません。属性を適用するときにプロパティ値を指定する場合、配列に挿入されるすべてまたはオブジェクトは、同じ要素名と既定の名前空間を持っている必要があります。そうでない場合、例外がスローされます。プロパティ値を設定する場合は、プロパティも設定する必要があり、またはオブジェクトも同じ名前と名前空間の値を持つ必要があります。いいえXmlElementXmlNodeNameXmlElementXmlNodeNamespaceNameXmlElementXmlNodeName値が指定されている場合、XmlElementまたはXmlNodeオブジェクトは任意の要素名を持つことができます。

Namespaceしたがって、解決策は単にプロパティ値を削除することだと思います:

[System.Xml.Serialization.XmlAnyElement]
于 2009-09-20T14:46:21.210 に答える