【问题标题】:How to marshall XML with namespace in JAXB?如何在 JAXB 中使用命名空间编组 XML?
【发布时间】:2018-03-27 21:30:26
【问题描述】:

我想使用已定义的 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 {
}

简单测试导致“Cannot find the declaration of element 'element'.”错误。

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 时,效果很好。

我做错了什么?

【问题讨论】:

  • 您可以在编组时忽略命名空间位置,例如 jaxbMarshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "");
  • @Yogi 我想将它包含在生成的 XML 中,而不是忽略它。

标签: java xml xsd jaxb


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。但是无论如何都没有告诉编组器在默认命名空间中搜索元素吗?所以程序不必知道它。
猜你喜欢
  • 2019-02-17
  • 1970-01-01
  • 2014-11-28
  • 1970-01-01
  • 1970-01-01
  • 2014-11-07
  • 1970-01-01
  • 1970-01-01
  • 2010-09-21
相关资源
最近更新 更多