我正在尝试使用jaxb生成xml。我创建了xsd并生成了java类。 但是当我生成xml时,我将前缀ns2与根标记相匹配,这是我不想要的。
例如:我希望root标签为
<report>
<id>rep 1</id>
</report>
,但是得到了
<ns2:report>
....
</ns2:report>
在生成的java类中,我给出了注释@XmlRootElement(name="report",namespace="urn:report")
有人可以帮忙吗
答案 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));