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

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

例如:我想要root标签

 rep 1  

,但得到

  ....  

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

有人可以帮助

如果这是你的class级:

 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”元素不是。

  123  

如果将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模式匹配也可能不匹配:

  123  

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

看看这个答案 。 它描述了如何使用SAX Filter删除任何命名空间。

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

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

  

不知怎的,接受的答案对我不起作用。 当我在cxf和filterNoNamesWriter中发现涉及DelegatingXMLStreamWriter的一些相关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); } } 

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

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