jaxb,子元素的单独命名空间

时间:2013-05-14 20:53:10

标签: java jaxb2

我正在尝试使用类似于以下格式的jaxb创建XML,其中child元素具有单独的名称空间。

 <soap:Envelope xmlns:soap="http://demo.org/soap/envelope/"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <soap:Header>
           <element1 xmlns="http://childnamespacehere">
          <att1>test</att1>
          <att2>test</att2>
          </element1>       
     </soap:Header>
     <soap:Body>
         <element2 xmlns="http://childnamespacehere">
            <att1>test</att1>
            <att2>test</att2>
        </element2 >
    </soap:Body>
</soap:Envelope>

我的班级

  @XmlRootElement(name = "soap:Envelope", namespace = "http://schemas.xmlsoap.org/soap/envelope/")
  public class Envelope     

    private Element1 element1;   

    private Element2  element2;

    @XmlElementWrapper(name = "soap:Header")
    @XmlElement(name = "Element1", namespace = "http://childelementnamespace/")
    public void setElement1(Element1 element){ }

    @XmlElementWrapper(name = "soap:Body")
    @XmlElement(name = "Element2" , namespace = "http://childelementnamespace/")
    public void setElement2(Element2 element){ }

但我得到的xml如下所示,其中子架构处于根级别。

 <soap:Envelope xsi:schemaLocation="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://childelementnamespace/"  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
        <soap:Header>
            <ns2:Element1>
                <att1>value</att1>
                <att2>value</att2>
            </ns2:Element1>
        </soap:Header>
        <soap:Body>
            <ns2:Element2>
                 <att1>value</att1>
                <att2>value</att2>
            </ns2:Element2>
        </soap:Body>
    </soap:Envelope>

我在package-info.java中定义了@xmlschema

 @XmlSchema(namespace = "http://schemas.xmlsoap.org/soap/envelope/",
    xmlns = { @javax.xml.bind.annotation.XmlNs(prefix = "Element1", namespaceURI = "http://childelementnamespace"),
            @javax.xml.bind.annotation.XmlNs(prefix = "Element2", namespaceURI = "http://childelementnamespace") },
            elementFormDefault = XmlNsForm.QUALIFIED)

    package com.model;

    import javax.xml.bind.annotation.XmlNsForm;
    import javax.xml.bind.annotation.XmlSchema;

当我生成xml时,没有生成子元素的名称空间,我只获得了根元素的命名空间。

3 个答案:

答案 0 :(得分:2)

我通过向对象(childnode)Element1和Element2添加“xmlns”属性来解决。

  class Elemenet1

  @XmlAttribute(name="xmlns")
  String xmlns = "http://childnamespacehere";

  public void setXmlns(String namespace){};

  public String getXmlns(){};

输出

<soap:Envelope xmlns:soap="http://demo.org/soap/envelope/"      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <soap:Header>
           <element1 xmlns="http://childnamespacehere">
          <att1>test</att1>
          <att2>test</att2>
          </element1>       
     </soap:Header>
     <soap:Body>
         <element2 xmlns="http://childnamespacehere">
            <att1>test</att1>
            <att2>test</att2>
        </element2 >
    </soap:Body>
</soap:Envelope>

答案 1 :(得分:0)

在你说正在生成的内容的顶部有xmlns:ns2="http://childelementnamespace/"的情况下,这是声明命名空间并以这种方式使用<ns2:Element2>使用ns2这里使用先前声明的namspace。

所以你期望的和你得到的是在不同地方声明的完全相同,jaxB方法更正确,因为它不会多次声明相同的命名空间。

答案 2 :(得分:0)

这是一个临时解决方案。当您想要解组xml文档时,这会触发主要问题。 但是你也可以使用不同的包进行马歇尔和解组过程。