如何在JAXB中使用命名空间编组XML?

时间:2017-10-16 11:13:03

标签: java xml xsd jaxb

我想使用定义的XSD架构封送XML:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="myNamespace" xmlns="myNamespace">
    <xs:element name="element" type="JavaBean" />
    <xs:complexType name="JavaBean">
    </xs:complexType>
</xs:schema>

这是空的Java bean类型:

package main;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "JavaBean")
public class JavaBean {
}

&#34; 中的简单测试结果无法找到元素&#39;元素&#39; &#34;的声明。错误。

package main;

import java.io.File;
import java.io.IOException;

import javax.xml.XMLConstants;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.namespace.QName;
import javax.xml.validation.Schema;
import javax.xml.validation.SchemaFactory;

import org.xml.sax.SAXException;

public class Test {
    public static void main(String[] args) throws JAXBException, IOException, SAXException {
        final SchemaFactory factory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = factory.newSchema(new File("sample.xsd"));

        JavaBean message = new JavaBean();
        JAXBElement<JavaBean> element = new JAXBElement<>(new QName("element"), JavaBean.class, message);

        JAXBContext context = JAXBContext.newInstance(JavaBean.class);
        Marshaller jaxbMarshaller = context.createMarshaller();
        jaxbMarshaller.setSchema(schema);
        jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        jaxbMarshaller.marshal(element, System.out);
    }
}

有趣的是,当我从XML Schema Definition中删除targetNamespace和xmlns时,它运行良好。

我做错了什么?

1 个答案:

答案 0 :(得分:2)

根据您的架构,该元素默认绑定到myNamespace命名空间。

因此,您需要使用正确的命名空间创建JavaBean

JAXBElement<JavaBean> element = new JAXBElement<>(new QName("myNamespace", "element"), JavaBean.class, message);