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