2010-11-30 92 views
9

我想用jaxb生成xml。我创建了xsd和生成的java类。 但是,当我生成XML,我是前缀ns2的根源标签,我不想要。Jaxb生成的xml - 根元素前缀问题

恩:我想根标签是

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

,但要作为

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

在生成的Java类,我给注释作为@XmlRootElement(name="report",namespace="urn:report")

可不可以有一个人请帮助

回答

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> 

如果添加了一个包,信息类模型,您可以leverate的@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和命名空间的更多信息,请参阅:

+0

如果对象中有两个名称空间,它会变成'`,那么有些部分将使用` navins 2014-08-26 11:26:38

1

博客条目Customizing JAXB显示alter通过实施PreferredMapper提供的本机。不幸的是,它解释说,这是不可能完全禁止命名空间。

+1

由于。有用的,但首选的映射器改变了前缀,并不删除前缀。在页面底部,他们说它不可能删除前缀。我正在尝试解决这个问题。 – crazyTechie 2010-11-30 11:00:51

1

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

+0

有帮助。谢谢。 – crazyTechie 2010-12-09 07:55:37

0

使用该属性在模式中的根元素:将elementFormDefault = “合格” 因此,例如:

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

不知为什么,接受的答案并没有为我工作。当我在cxf和筛选器NoNamesWriter中发现涉及DelegatingXMLStreamWriter的一些相关库存溢出问题时找到了解决方案,我获得了成功。实施我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(新FileOutputStream中(OUTFILE,假));