我正在尝试使用类似于以下格式的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时,没有生成子元素的名称空间,我只获得了根元素的命名空间。
答案 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文档时,这会触发主要问题。 但是你也可以使用不同的包进行马歇尔和解组过程。