0

Web サービスから送信されたデータ値の取得について質問があります。クライアントからデータを受け取り、それを使って何かをする Web サービスがあります。それはすべて完璧に機能しました。

しかし、ここで、Web サービスが受信するメッセージを処理する要素を xsd に追加したいと考えました。他の要素にも存在する別の complexType にテストを追加しました。要素 tests は必須ではありませんが、ユーザーは XML ファイルに 1 つ以上のテストを追加できます。

 <xs:element name="tests">
        <xs:complexType>
            <xs:sequence minOccurs="0" maxOccurs="999">
                <xs:element name="test">
                    <xs:complexType>
                        <xs:sequence minOccurs="1" maxOccurs="unbounded">
                            <xs:element name="code" type="xs:string" minOccurs="1" maxOccurs="1"/>
                            <xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="1"/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>            
    </xs:element>

全体の XSD: http://pastebin.com/TuvYiQzE

クライアントから送信される Web サービス メッセージを処理するために JAXB を使用しています。JAXB は、いくつかのコードを自動的に生成してくれました。

public Message.Algemeen.TestCode.Tests getTests(){
    return tests;
}

  public List<Message.Algemeen.TestCode.Tests.test> getTest() {
            if (test== null) {
                test= new ArrayList<Message.Algemeen.TestCode.Tests.test>();
            }
            return this.test;
  }

今、要素ごとにコードと値を返したいのですtestが、問題はテストであり、テストはオブジェクトとして返され、現時点ではそれらの値を読み取る方法がわかりません。メソッドtoString()は単に戻りますcp.jaxb.classes.Message$Algemeen$Testcode$Tests$test@dcd76a

私は何を間違っていますか?私の問題を理解するためにさらにコードが必要な場合は、教えてください。

ありがとう、

ジェフ

PS。英語は私の母国語ではありません。問題を説明するために最善を尽くしました。

4

3 に答える 3

1

<xs:sequence minOccurs="1" maxOccurs="unbounded">Test の定義のこの行は、テストで複数のコード:値のペアを使用できることを意味します。これは、あなたの望むことですか?

私は jaxb の専門家ではありませんが、スキーマを設計するときに、この場合は名前型を使用する方が簡単だと言われました。

ここに、テスト内の「名前のない」オブジェクト (コード:値のペア) のリストがあります。そして、それが検索を困難にしていると思います。

maxOccurs="1" に変更するとどうなりますか? コードと値のペアに新しい型を定義し、この要素のリストを作成するとどうなりますか?

次のように変更してみてください:

<xs:element name="tests">
    <xs:complexType>
        <xs:sequence minOccurs="0" maxOccurs="999">
            <xs:element name="test">
                <xs:complexType>
                    <xs:sequence minOccurs="1" maxOccurs="unbounded">
                      <xs:element name="singleTest">
                         <xs:complexType>
                           <xs:sequence minOccurs="1" maxOccurs="1">
                             <xs:element name="code" type="xs:string" minOccurs="1" maxOccurs="1"/>
                             <xs:element name="value" type="xs:string" minOccurs="1" maxOccurs="1"/>
                          </xs:sequence>
                         </xs:complexType>
                      </xs:element>
                    </xs:sequence>
                </xs:complexType>
            </xs:element>
        </xs:sequence>
    </xs:complexType>
</xs:element>

次に、 List testList = test.getSingleTest() のようなものを用意し、反復してそれぞれのコードと値を取得できるはずです。

于 2012-10-19T10:36:31.493 に答える
0

これは機能するはずです:

List<Message.Algemeen.TestCode.Tests.test> tests = yourObject.getTest();
for (Message.Algemeen.TestCode.Tests.test test : tests) {
   test.getCode(); //Here is test object which contains strings or whatever.
}
于 2012-10-19T11:26:29.860 に答える
0

クライアントは何語で書いていますか?たとえば、Java または .Net を使用している場合、Web サービス メソッドを呼び出すだけで、完全に形成された Test のインスタンスを取得できます。上で Udo Klimashewski が指摘しているように、これは次のようなものを使用できるはずであることを意味します。

getTest().getCode() 

明確にするために、XSD に目を通すことは興味深い可能性がありますが、開発環境で SOAP Web サービスのサポートが不足していない限り、実際にこれを行う必要はありません。クライアント側のアーティファクトを生成する正確なメカニズムは、言語と開発環境によって異なります。例として、Netbeans を使用して Web サービスを参照するプロセスを次に示します。

http://netbeans.org/kb/docs/websvc/client.html

于 2012-10-19T11:22:41.810 に答える