【发布时间】:2013-05-14 20:53:09
【问题描述】:
我正在尝试使用如下格式的 jaxb 创建 XML,其中子元素具有单独的名称空间。
<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 时,没有生成子元素的命名空间,我只获取根元素的命名空间。
【问题讨论】:
-
你的问题是什么?
-
我需要在生成 xml 时获取子命名空间,但我不是
-
你得到的 XML 是有效的,为什么你需要你的 NS 驻留在子元素中?
-
我正在调用soap服务,它需要带有命名空间的子节点的xml。如果我没有子节点的命名空间,服务会抛出异常。
-
但是您的子节点确实有一个命名空间,我看不到问题所在,它们的前缀是 ns2,它继承了顶部 ns2 命名空间中声明的命名空间。