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

9
我正在尝试使用JAXB生成XML。我创建了XSD并生成了Java类。但是在生成XML时,我得到了前缀ns2作为根标签,而我不想要它。
例如:我希望根标签为

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

但是获取的结果包含了

标签。
<ns2:report>
....
</ns2:report>

在生成的Java类中,我使用了注释@XmlRootElement(name="report",namespace="urn:report")
请问有人能帮忙吗?
5个回答

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;
    }

}

那么,在根元素上使用前缀就有意义,因为您已指定“根”元素是命名空间限定的,而“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和命名空间的信息,请参考:


如果对象中有两个命名空间,它会变成这样<Message xmlns:ns2="http://404story.com/Code" xmlns="http://404story.com/Order">,然后某些部分将使用<ns2:xxx>。你能告诉我如何去掉ns2前缀吗? - navins
@navins - 你能把这个作为一个新问题发布吗? - bdoughan
好的,请查看以下链接:http://stackoverflow.com/questions/25518253/jaxb-generated-xml-remove-namespace-prefix - navins

1
博客文章自定义JAXB展示了通过实现PreferredMapper提供的替代方案。不幸的是,它解释了无法完全禁止命名空间。

1
谢谢。很有用。但是首选的映射器更改前缀,而不是删除前缀。在页面底部,他们说无法删除前缀。我正在尝试解决方法。 - crazyTechie

1

看一下这个答案。它描述了如何使用SAX过滤器来删除任何命名空间。


0

一些问题,被接受的答案对我并没有起到作用。当我在stackoverflow上找到了一些相关的解决方案时,我使用了DelegatingXMLStreamWriter和一个filter——NoNamesWriter,那么我就成功了。我使用的实现方式是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);
    }

}

调用与此处描述的相同,例如:

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


0
在您的模式根元素中使用此属性:elementFormDefault="qualified" 例如:
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接