@xmlSchema использование аннотации с 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">

Что я делаю неправильно? Как я могу получить ожидаемый результат?

Ответ 1

Вы можете записать расположение схемы следующим образом:

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"/>

Ответ 2

Извините за задержку.... Спасибо за вашу помощь, теперь я могу показать schemaLocation, но у меня все еще нет xml, как хотелось бы. Возможно, я не объяснил сценарий должным образом с самого начала, позвольте мне попробовать еще раз:

У меня есть две схемы: 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;

и для общей схемы:

@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, но я не знаю, как его получить. Это может быть здорово, если вы сможете помочь в этом.