Я пытаюсь сгенерировать 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>
Насколько я понимаю, информация о пакете определяет, как префиксы должны отображаться, но мой результат выглядит другой. Что я могу здесь пропустить?