@xmlSchema注释与jaxb一起使用

时间:2011-02-01 14:31:18

标签: xml schema annotations jaxb

我无法在xml文件中显示在包级别使用@xmlSchema批注配置的所有参数。例如,如果我设置:

@javax.xml.bind.annotation.XmlSchema (               
    xmlns = { 
            @javax.xml.bind.annotation.XmlNs(prefix = "com", 
                     namespaceURI="http://es.indra.transporte.common"),

            @javax.xml.bind.annotation.XmlNs( prefix = "xsi",
                     namespaceURI="http://www.w3.org/2001/XMLSchema-instance"),

            @javax.xml.bind.annotation.XmlNs( prefix = "ns2",
                     namespaceURI="http://es.indra.transporte.configuration"),             
           },    
    location = "http://es.indra.transporte.configuration StationNetwork.xsd",
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED        
)
package es.indra.transporte.central.thalesinterface.common.beans;

我希望看到类似的内容:

<stationNetwork xmlns:ns2="http://es.indra.transporte.configuration"
                xmlns:com="http://es.indra.transporte.common"
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                xsi:schemaLocation="http://es.indra.transporte.configuration StationNetwork.xsd">

但我得到以下输出:

<stationNetwork xmlns:com="http://es.indra.transporte.common">

我做错了什么?如何获得预期的输出?

2 个答案:

答案 0 :(得分:3)

您可以按如下方式写出架构位置:

Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://es.indra.transporte.configuration StationNetwork.xsd");
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(root, System.out);

运行以下代码:

import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(StationNetwork.class);

        StationNetwork root = new StationNetwork();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://es.indra.transporte.configuration StationNetwork.xsd");
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(root, System.out);
    }

}

输出 - Metro (JAXB RI)

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<stationNetwork 
    xmlns:com="http://es.indra.transporte.common"  
    xmlns:ns2="http://es.indra.transporte.configuration"     
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://es.indra.transporte.configuration StationNetwork.xsd"/>

输出 - EclipseLink JAXB (MOXy)

<?xml version="1.0" encoding="UTF-8"?>
<stationNetwork 
    xsi:schemaLocation="http://es.indra.transporte.configuration StationNetwork.xsd" 
    xmlns:ns2="http://es.indra.transporte.configuration" 
    xmlns:com="http://es.indra.transporte.common" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>

答案 1 :(得分:1)

抱歉延迟....感谢您的帮助,现在我可以展示schemaLocation,但我仍然没有我想要的xml。也许我从一开始就没有正确解释这个场景,让我再试一次:

我有2个架构: CommonDataTypeCairo.xsd StationNetwork.xsd ,它导入前一个架构以使用通用结构。

CommonDataTypeCairo.xsd 按以下方式开始:

 <schema xmlns="http://www.w3.org/2001/XMLSchema"
         xmlns:com="http://es.indra.transporte.common"
         targetNamespace="http://es.indra.transporte.common"
         elementFormDefault="qualified"
         attributeFormDefault="unqualified">
    <complexType name="head">         
         <sequence>             
           <element name="formatVersion" type="integer"/>
         <element name="confVersion" type="integer"/>             
           <element name="generationDate" type="dateTime"/>                              
           <element name="activationDate" type="dateTime"/>         
         </sequence>
  </complexType>

StationNetwork.xsd

 <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
            xmlns:com="http://es.indra.transporte.common"
            xmlns="http://es.indra.transporte.configuration"
            targetNamespace="http://es.indra.transporte.configuration"
            lementFormDefault="qualified" attributeFormDefault="unqualified">
    <xs:import namespace="http://es.indra.transporte.common"
               schemaLocation="CommonDataTypeCairo.xsd"/>

我在不同的包中有绑定的java类,所以我有不同的package-info.java文件。对于StationNetwork架构,我有:

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://es.indra.transporte.configuration"                
)
package es.indra.transporte.central.thalesinterface.topology.beans;

和Common schema:

@javax.xml.bind.annotation.XmlSchema(
    namespace = "http://es.indra.transporte.common",
    elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED,
    attributeFormDefault = javax.xml.bind.annotation.XmlNsForm.UNQUALIFIED
)
package es.indra.transporte.central.thalesinterface.common.beans;

我使用此配置的 StationNetwork.xml 是:

<ns3:stationNetwork xmlns:ns2="http://es.indra.transporte.common"
                    xmlns:ns3="http://es.indra.transporte.configuration" 
                    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                    xsi:schemaLocation="http://es.indra.transporte.configuration StationNetwork.xsd">
<head>
    <ns2:formatVersion>1</ns2:formatVersion>
    <ns2:confVersion>1</ns2:confVersion>
    <ns2:generationDate>2010-12-22T00:00:00Z</ns2:generationDate>
    <ns2:activationDate>2010-12-21T09:07:25Z</ns2:activationDate>
</head>

无效,我想要的输出是:

<stationNetwork xmlns:ns2="http://es.indra.transporte.common"
                xmlns="http://es.indra.transporte.configuration" 
                xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
                xsi:schemaLocation="http://es.indra.transporte.configuration StationNetwork.xsd">
<head>
    <ns2:formatVersion>1</ns2:formatVersion>
    <ns2:confVersion>1</ns2:confVersion>
    <ns2:generationDate>2010-12-22T00:00:00Z</ns2:generationDate>
    <ns2:activationDate>2010-12-21T09:07:25Z</ns2:activationDate>
</head>

没有ns3前缀,但我不知道如何获得它。如果你可以提供帮助,那就太棒了。