0

我有一个关于检索从 Web 服务发送的数据值的问题。我有一个 Web 服务,它从客户端接收数据,然后对其进行处理。这一切都很完美。

但是现在我想在 xsd 中添加一个额外的元素来处理 web 服务接收到的消息。我已将测试添加到另一个也存在其他元素的 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。英语不是我的母语,我尽力解释我的问题。

4

3 回答 3

1

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

我不是 jaxb 专家,但在设计模式时有人告诉我,在这种情况下使用名称类型更容易。

在这里,您有一个测试中“未命名”对象(代码:值对)的列表。我想这会使检索变得困难。

如果您更改为 maxOccurs="1" 会发生什么?如果你为你的 code:value 对定义了一个新类型并列出了这个元素,会发生什么?

你能试着像这样修改它:

<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

你用什么语言写你的客户?例如,如果您使用 Java 或 .Net,您应该能够简单地调用您的 Web 服务方法并获取完整的 Test 实例。正如 Udo Klimaschewski 上面指出的那样,这意味着您应该能够使用类似的东西

getTest().getCode() 

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

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

于 2012-10-19T11:22:41.810 回答
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 回答