我有一个关于检索从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。英语不是我的母语,我尽力解释我的问题。
答案 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服务的过程:
答案 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.
}