Jaxb生成了xml - 根元素前缀的问题

时间:2010-11-30 10:20:08

标签: java xml jaxb

我正在尝试使用jaxb生成xml。我创建了xsd并生成了java类。 但是当我生成xml时,我将前缀ns2与根标记相匹配,这是我不想要的。

例如:我希望root标签为

 <report>
   <id>rep 1</id>
</report>

,但是得到了

<ns2:report>
....
</ns2:report>

在生成的java类中,我给出了注释@XmlRootElement(name="report",namespace="urn:report")

有人可以帮忙吗

5 个答案:

答案 0 :(得分:12)

如果这是你的班级:

package example;

import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name="report",namespace="urn:report")
public class Root {

    private String id;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

}

然后在根元素上有一个前缀是有意义的,因为你已经指定“root”元素是名称空间限定的而“id”元素不是。

<ns2:report xmlns:ns2="urn:report">
    <id>123</id>
</ns2:report>

如果您将package-info类添加到模型中,则可以显示@XmlSchema注释:

@XmlSchema(
        namespace = "urn:report",
        elementFormDefault = XmlNsForm.QUALIFIED)
package example;

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

然后JAXB实现可以选择利用默认命名空间,但请注意,现在所有元素都是命名空间限定的,可能与您的XML模式匹配也可能不匹配:

<report xmlns="urn:report">
    <id>123</id>
</report>

有关JAXB和命名空间的更多信息,请参阅:

答案 1 :(得分:1)

博客条目Customizing JAXB显示了通过实施PreferredMapper提供的替代方案。不幸的是,它解释说,不可能完全抑制名称空间。

答案 2 :(得分:1)

看看this answer。它描述了如何使用SAX过滤器删除任何名称空间。

答案 3 :(得分:0)

在架构的根元素中使用此属性:elementFormDefault =“qualified” 例如:

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

答案 4 :(得分:0)

不知何故,接受的答案对我不起作用。当我在cxf和过滤器DelegatingXMLStreamWriter中涉及NoNamesWriter的一些相关stockOverflow问题中找到解决方案时,我获得了成功。我与NoNamesWriter一起使用的实现:

public class NoNamesWriter extends DelegatingXMLStreamWriter 
{
    @Override
    public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
        delegate.writeStartElement("", local, uri);
    }   

    public static XMLStreamWriter filter(FileOutputStream fileOutputStream) throws XMLStreamException {
        return new NoNamesWriter(XMLOutputFactory.newInstance().createXMLStreamWriter(fileOutputStream));
    }

    public NoNamesWriter(XMLStreamWriter writer) {
        super(writer);
    }

}

调用与here所述相同的内容,如:

xmlmarshaller.marshal(xc,NoNamesWriter.filter(new FileOutputStream(outfile,false));