2012-07-11 96 views
1

我正在使用JAXB编组肥皂请求。它正在工作,但生成的XML不包含soap:Envelope标记。此外,该名称空间在根元素上而不是在soap:Envelope标记中指示。 xml标签上还有一个额外的standalone属性。如何使用JAXB的编组器实现类似于第二个XML的输出?如何在使用JAXB进行封送时包含肥皂信封标签?

目前,这里是我的编组XML看起来像:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<Customer xmlns:ns="http://www.example.org/beanLevelNamespace"> 
    <ns:id>201200001</ns:id> 
    <ns:name>Name</ns:name> 
    <ns:age>18</ns:age> 
</Customer> 

这里是我多么希望它看起来像:

<?xml version="1.0" encoding="UTF-8"?> 
<soap:Envelope 
    xmlns:soap="http://www.w3.org/2001/12/soap-envelope" 
    soap:encodingStyle="http://www.w3.org/2001/12/soap-encoding"> 
    <soap:Body xmlns:ns="http://www.example.org/beanLevel1Namespace" xmlns:ns1="http://www.example.org/beanLevel2Namespace"> 
     <ns:Customer> 
      <ns1:id>201200001</ns:id> 
      <ns1:name>Name</ns:name> 
      <ns1:age>18</ns:age> 
     </ns:Customer> 
    </soap:Body> 
</soap:Envelope> 
+0

为什么你需要在你的XML信封?另外,如果名称空间存在于根级或Envelope中,它又有什么关系? – sreehari 2012-07-11 03:50:18

+0

@sreehari:它需要在信封里面,因为我要将它作为肥皂请求发送。关于名称空间的位置,我不确定它的位置是否重要。我在这里的示例请求中的名称空间位于信封内,因此我只是为了安全起见而遵循它。 – Arci 2012-07-11 04:04:47

+0

为什么你不使用JAX-WS呢? – 2014-01-25 07:08:39

回答

1

您可以在发送前添加一个信封内的XML。

"<Envelope><Body>" + your_xml + "</Body></Envelope> 

始终将您的名称空间保留在元素级别;不在信封级别。因为当你看一个元素时,你会清楚它是什么类型的。你保留名字空间的位置并不重要。

编组的XML存在问题。正确的XML是:

<ns:Customer xmlns:ns="http://www.example.org/beanLevelNamespace"> 
    <ns:id>201200001</ns:id> 
    <ns:name>Name</ns:name> 
    <ns:age>18</ns:age> 
</ns:Customer> 

同样,也不要紧,你把空间声明:

<ns:Customer xmlns:ns="http://www.example.org/beanLevelNamespace"> 
    <ns:id>201200001</ns:id> 
</ns:Customer> 

<Customer xmlns="http://www.example.org/beanLevelNamespace"> 
    <id>201200001</id> 
</Customer> 

<ns1:Customer xmlns:ns1="http://www.example.org/beanLevelNamespace"> 
    <ns2:id xmlns:ns2="http://www.example.org/beanLevelNamespace">201200001</ns2:id> 
</ns1:Customer> 

他们都是一样的。

+0

谢谢!我认为有一种方法可以让JAXB也生成肥皂信封?或者JAXB没有这种设置?另外,如果我只是在编组XML文件中添加肥皂标签,标签将包含在肥皂信封中。我可以设置JAXB不在生成的xml中包含标记吗? – Arci 2012-07-11 05:17:15

+1

JAX-B是一个XML处理API。它可以处理任何XML。为了调用Web服务,您将使用另一个API - 最好是JAX-WS。不要混合这两样东西。你为什么想在代码中处理SOAP信封?这将在JAX-WS的背后完成。 – sreehari 2012-07-11 05:55:06

+0

我们已经有一个调用Web服务的类。但是,它只能作为Web服务的连接器。为了起作用,整个SOAP信封和信封内容必须传递给所述课程。因此,我需要与信封的内容一起创建SOAP信封并将其传递给所述课程。我们没有使用JAX-WS。 – Arci 2012-07-11 06:24:26