如何检索从webservice发送的值

时间:2012-10-19 10:20:05

标签: java xsd jaxb wsdl

我有一个关于检索从Web服务发送的数据值的问题。我有一个Web服务,它从客户端接收数据然后用它做一些事情。它完美无缺。

但是现在我想在xsd中添加一个额外的元素来处理webservice收到的消息。我已经将测试添加到另一个也存在其他元素的complexType中。元素测试不是必需的,但用户可以在其XML文件中添加一个或多个测试。

 <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

我正在使用JAXB来处理从客户端发送的Web服务消息。 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。英语不是我的母语,我尽力解释我的问题。

3 个答案:

答案 0 :(得分:1)

Test的定义中的这一行<xs:sequence minOccurs="1" maxOccurs="unbounded">意味着您可以在测试中拥有多个代码:值对。这就是你想要的吗?

我不是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>
那么你应该能够拥有类似的东西 列表testList = test.getSingleTest() 并迭代以获取每个代码和值。

答案 1 :(得分:0)

你在用什么语言写客户?例如,如果您使用的是Java或.Net,则应该只需调用Web服务方法并获得完全形成的Test实例。正如Udo Klimaschewski指出的那样,这意味着你应该可以使用像

这样的东西
getTest().getCode() 

要清楚,虽然查看XSD可能很有意思,但除非您的开发环境缺乏SOAP Web服务支持,否则您实际上不需要这样做。生成客户端工件的确切机制取决于您的语言和开发环境;例如,此处描述了使用Netbeans引用Web服务的过程:

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

答案 2 :(得分: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.
}