将信息添加到JAXB marshaller生成的XML命名空间

时间:2013-08-27 18:26:05

标签: java xml jaxb

我正在使用JAXB编组一个对象,它产生以下输出

<?xml version="1.0"?><Jetstream xmlns="http://Jetstream.TersoSolutions.com/v1.0/HeartbeatEvent">......

我想要的输出是

<?xml version="1.0"?><Jetstream xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://Jetstream.TersoSolutions.com/v1.0/HeartbeatEvent">  

我正在使用以下代码编组对象

    JAXBContext context;

    try {
        context = JAXBContext.newInstance(heartbeat.getClass());
        OutputStream writer = new ByteArrayOutputStream();
        Marshaller marshaller = context.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_FRAGMENT, Boolean.TRUE);
        marshaller.setProperty("com.sun.xml.bind.xmlHeaders", "<?xml version=\"1.0\"?>");


        heartbeat.setHeader(header);
        heartbeat.setHeartbeatEvent(event);

        marshaller.marshal(heartbeat, writer);
        String stringXML = writer.toString();
        return stringXML;

    } catch (JAXBException e) {
        throw new RuntimeException("Problems generating XML in specified "
                + "encoding, underlying problem is " + e.getMessage(),
                e);

添加

marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.w3.org/2001/XMLSchema"); 

将导致输出接近预期,除了错误的顺序和错误的前缀

<?xml version="1.0"?><Jetstream xmlns="http://Jetstream.TersoSolutions.com/v1.0/HeartbeatEvent" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.w3.org/2001/XMLSchema">...

我想请求一些帮助,以正确的顺序生成我的命名空间并使用正确的前缀。

修改

在遵循评论中的建议后,我仍然没有运气。我将以下内容添加到相关包中的package-info.java文件中。

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://Jetstream.TersoSolutions.com/v1.0/HeartbeatEvent",
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
    xmlns={@XmlNs(prefix="xsd", namespaceURI="http://www.w3.org/2001/XMLSchema") })

我的结果是

<?xml version="1.0"?><ns2:Jetstream xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns2="http://Jetstream.TersoSolutions.com/v1.0/HeartbeatEvent">

由于某种原因,前缀被缩短了,现在整个xml中都有ns2:标签。这些标签不能出现。

0 个答案:

没有答案