java - Jaxb - 如何避免根元素出现 "xsi:"

标签 java xml xsd jaxb

我正在使用 Java 7 并尝试使用 jaxb 从 xsd 创建 xml。

我从 xsd 生成了 Java 类.

1 类:

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"vnr",
"meldungsart",
"teilnehmeranzahl",
"email",
"teilnehmer"
 })
@XmlRootElement(name = "Veranstaltung")
public class Veranstaltung {

@XmlElement(name = "VNR", required = true)
protected String vnr;
@XmlElement(name = "Meldungsart", required = true)
protected String meldungsart;
@XmlElement(name = "Teilnehmeranzahl")
protected int teilnehmeranzahl;
@XmlElement(name = "EMAIL")
protected String email;
@XmlElement(name = "Teilnehmer")
protected List<Teilnehmer> teilnehmer;

2级

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"efn",
"punkteBasisJN",
"punkteZusatzLernkontrolleJN",
"punkteInteraktivitaetJN",
"punkteReferent"
})
@XmlRootElement(name = "Teilnehmer")
public class Teilnehmer {

@XmlElement(name = "EFN", required = true)
protected String efn;
@XmlElement(name = "Punkte_Basis_JN", required = true)
protected String punkteBasisJN;
@XmlElement(name = "Punkte_Zusatz_Lernkontrolle_JN", required = true)
protected String punkteZusatzLernkontrolleJN;
@XmlElement(name = "Punkte_Interaktivitaet_JN", required = true)
protected String punkteInteraktivitaetJN;
@XmlElement(name = "Punkte_Referent")
protected int punkteReferent;

现在我使用 JAXB 创建一个 xml:

    JAXBElement<eiv.Veranstaltung> tmp = ObjectFactoryNew
            .createEvent(event);
    JAXBContext jaxbContext = JAXBContext
            .newInstance(eiv.Veranstaltung.class);
    Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
    jaxbMarshaller.setProperty(Marshaller.JAXB_ENCODING, "ISO-8859-15");
    jaxbMarshaller.setProperty("jaxb.noNamespaceSchemaLocation",
            "eiv-punktemeldung.xsd");
    jaxbMarshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.FALSE);

    jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
    jaxbMarshaller.marshal(tmp, System.out);

ObjectFactory.java

@XmlRegistry
private static class ObjectFactoryNew {

    private static final QName EVENT_QNAME = new QName(
            "http://www.w3.org/2001/XMLSchema-instance", "Veranstaltung");

    private ObjectFactoryNew() {

    }

    /**
     * Create an instance of {@link JAXBElement }{@code <}
     * {@link Veranstaltung } {@code >}
     * 
     */
    @XmlElementDecl(namespace = "http://www.w3.org/2001/XMLSchema-instance", name = "Veranstaltung")
    public static JAXBElement<eiv.Veranstaltung> createEvent(
            eiv.Veranstaltung value) {
        return new JAXBElement<eiv.Veranstaltung>(EVENT_QNAME,
                eiv.Veranstaltung.class, null, value);
    }

}

输出:

<?xml version="1.0" encoding="ISO-8859-15" standalone="yes"?>
<xsi:Veranstaltung xsi:noNamespaceSchemaLocation="eiv-punktemeldung.xsd"      
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<VNR>2760012007000000289</VNR>
<Meldungsart>N</Meldungsart>
<Teilnehmeranzahl>1</Teilnehmeranzahl>
<EMAIL>lukas.mustermann@mailinator.com</EMAIL>
<Teilnehmer>
    <EFN>802760010002185</EFN>
    <Punkte_Basis_JN>J</Punkte_Basis_JN>
    <Punkte_Zusatz_Lernkontrolle_JN>N</Punkte_Zusatz_Lernkontrolle_JN>
    <Punkte_Interaktivitaet_JN>N</Punkte_Interaktivitaet_JN>
    <Punkte_Referent>0</Punkte_Referent>
</Teilnehmer>
</xsi:Veranstaltung>

如何避免“xsi:Veranstaltung”?我做错了什么?

最佳答案

您的情况是正确的。

private static final QName EVENT_QNAME = new QName(
            "http://www.w3.org/2001/XMLSchema-instance", "Veranstaltung");  

来自QName文档:

public QName(String namespaceURI, String localPart)
Parameters:
namespaceURI - Namespace URI of the QName
localPart - local part of the QName

所以你的根元素<Veranstaltung>具有命名空间 "http://www.w3.org/2001/XMLSchema-instance" (别名 xsi )。
如果您不需要此命名空间,则应该创建 QName仅包含本地部分。

private static final QName EVENT_QNAME = new QName("Veranstaltung");

关于java - Jaxb - 如何避免根元素出现 "xsi:",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28625252/

相关文章:

java - 如何实现具有自定义开始时间的倒数计时器?

java - Pircbot,检索完整用户列表时出现问题

如果 XML 文件附加了模式,c# XSLT 转换不起作用?

java - 在 Java 中解析 XML 时从 String 中删除无效字符

java - 如何为给定 xml 的客户端 saaj 创建 SOAP 请求

java - 使用参数 XMLReaders.XSDVALIDATING 操作 SAXBuilder 时出错

c# - XSD 验证不会失败尾随换行符

java - NoClassDefFound 错误,因为 System.loadLibrary(Core.NATIVE_LIBRARY_NAME)

java - 缺少返回语句方法ReturnCopy

sql-server - 使用同一行中的另一个列值更新 SQL Server 2005 中的 XML 节点(在 XML 列中)