Изменить XML Сериализация пространства имен (jaxb, jaxb-maven-plugin, xsd) - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь сгенерировать xml файлы с помощью jaxb, в зависимости от файлов привязки jaxb и xsd.

test.xsd:

<xs:schema
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns="http://www.my-custom-namespace.com"
        targetNamespace="http://www.my-custom-namespace.com">
     ...
     <!-- element definitions omitted -->
</xs:schema>

Все элементы определены в xsd.

файл привязки:

<?xml version="1.0"?>
<jxb:bindings version="1.0"
  xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:namespace="http://jaxb2-commons.dev.java.net/namespace-prefix"
  xsi:schemaLocation="http://java.sun.com/xml/ns/jaxb http://java.sun.com/xml/ns/jaxb/bindingschema_2_0.xsd
    http://jaxb2-commons.dev.java.net/namespace-prefix https://raw.githubusercontent.com/Siggen/jaxb2-namespace-prefix/master/src/main/resources/prefix-namespace-schema.xsd">

  <jxb:bindings schemaLocation="test.xsd">
    <jxb:schemaBindings>
      <jxb:package name="test" />
    </jxb:schemaBindings>
    <jxb:bindings>
      <namespace:prefix name="" namespaceURI="http://www.my-custom-namespace.com"/>
    </jxb:bindings>
  </jxb:bindings>
</jxb:bindings>

сгенерированная информация о пакете:

@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.my-custom-namespace.com", xmlns = {@javax.xml.bind.annotation.XmlNs(namespaceURI = "http://www.my-custom-namespace.com", prefix = "")})
interface $$package-info /* Real name is 'package-info' */ {
}

Конфигурация Jaxb-maven-plugin:

 <plugin>
        <groupId>org.jvnet.jaxb2.maven2</groupId>
        <artifactId>maven-jaxb2-plugin</artifactId>
        <version>0.14.0</version>
        <configuration>
          <schemaDirectory>src/main/resources/xsd</schemaDirectory>
          <schemaIncludes>
            <include>test.xsd</include>
          </schemaIncludes>
          <bindingDirectory>src/main/resources/xsd</bindingDirectory>
          <bindingIncludes>
            <include>bindings.xml</include>
          </bindingIncludes>
          <generateDirectory>${project.build.directory}/generated-sources</generateDirectory>
          <generatePackage>com.example.test</generatePackage>
          <args>
            <arg>-extension</arg>
            <arg>-Xnamespace-prefix</arg>
          </args>
        </configuration>
        <executions>
          <execution>
            <goals>
              <goal>generate</goal>
            </goals>
          </execution>
        </executions>
        <dependencies>
          <dependency>
            <groupId>org.jvnet.jaxb2_commons</groupId>
            <artifactId>jaxb2-namespace-prefix</artifactId>
            <version>1.3</version>
          </dependency>
        </dependencies>
      </plugin>

Конфигурация Marschaller:

 @Bean
  public Marshaller xmlMarshaller() throws JAXBException {
    JAXBContext jc2 = JAXBContext.newInstance(Document.class);
    Marshaller marshaller = jc2.createMarshaller();
    marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
//    marshaller.setProperty("com.sun.xml.bind.namespacePrefixMapper", new JaxBNamespaceMapper());
    return marshaller;
  }

Как вы можете видеть, я также пробовал разные аппроксимации, найденные в других SO-ответах и ​​блогах, но отбросил их, поскольку прочитал, что могу полагаться исключительно на файл xsd и bindings, что является предпочтительным

Класс документа (сгенерированный):

@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(
  name = "",
  propOrder = {"created", ....} 
)
@XmlRootElement(
  name = "document"
)
public class Document {

Вот что я получаю:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:document xmlns:ns2="http://www.my-custom-namespace.com">
    <created>2020-02-02T19:31:00.000+01:00</created>
    ... 
    <!-- elements omitted -->
</ns2:document>

Поскольку вы можете видеть, что все вложенные элементы неквалифицированы, мне нужно то же самое для элемент верхнего уровня тоже, так что это то, что мне нужно (см. префиксы пространства имен):

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<document xmlns="http://www.my-custom-namespace.com">
    <created>2020-02-02T19:31:00.000+01:00</created>
    ... 
    <!-- elements omitted -->
</document>

Насколько я понимаю, информация о пакете определяет, как префиксы должны отображаться, но мой результат выглядит другой. Что я могу здесь пропустить?

...