我正在使用 Jaxb2 插件从 XSD 文件生成 JAVA 类文件
这是我的插件配置
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>jaxb2-maven-plugin</artifactId>
<version>2.5.0</version>
<executions>
<execution>
<id>parentA</id>
<goals>
<goal>xjc</goal>
</goals>
</execution>
</executions>
<configuration>
<sources>
<source>src/test/resources/xsd/parent.xsd</source>
</sources>
<packageName>com.sample.generated</packageName>
<clearOutputDir>false</clearOutputDir>
</configuration>
</plugin>
这是我的示例 XSD 文件:
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" jaxb:version="2.1"
attributeFormDefault="qualified"
elementFormDefault="qualified">
<xs:include schemaLocation="../contracts/childc.xsd"/>
<xs:include schemaLocation="../contracts/childa.xsd"/>
<xs:include schemaLocation="../contracts/childb.xsd"/>
<xs:element name="parent">
<xs:complexType>
<xs:annotation>
<xs:appinfo>
<jaxb:class name="ParentA"/>
</xs:appinfo>
<xs:documentation>Parent profile</xs:documentation>
</xs:annotation>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="birthPlace" type="xs:string"/>
<xs:element ref="childA"/>
<xs:element ref="childB"/>
<xs:element ref="childC"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
我正在指定需要在 XSD 文件中使用以下配置生成的类文件的名称。
<xs:appinfo>
<jaxb:class name="ParentA"/>
</xs:appinfo>
这是我正在尝试解压缩的示例 XML 文件
<parentA>
<name>SAM</name>
<birthPlace>Dallas</birthPlace>
<childA>..</childA>
<childB>..</childB>
<childC>...</childC>
</parentA>
这是对上面的 XML 进行编组的逻辑
JAXBContext jaxbContext = JAXBContext.newInstance(parentA.class);
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller();
parentA parentData = (parentA) jaxbUnmarshaller.unmarshal(xml.getBinaryStream());
//Assert on parentData
问题:
删除 XSD 中的以下内容即可使其正常工作
<xs:appinfo>
<jaxb:class name="ParentA"/>
</xs:appinfo>
您将生成以下类(但不是所需的名称)。
@XmlRootElement(name = "parent")
public class Parent
由于您使用
xsd:element
名称声明了 parent
,因此您应该尝试解组以下 XML
<parent>
<name>SAM</name>
<birthPlace>Dallas</birthPlace>
<childA>..</childA>
<childB>..</childB>
<childC>...</childC>
</parent>
针对
org.jvnet.jaxb:jaxb-maven-plugin
进行测试,没有 childX
元素(因为未提供的 XSD 中的引用),使用 XML parent
标记名称解组/编组成功。
编组输出:
context.createMarshaller().marshal(dto, System.out);
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<parent><name>SAM</name><birthPlace>Dallas</birthPlace></parent>
如果您仍然想要
parentA
作为标签名称,您应该在 XSD 中将名称标签从 parent
更改为 parentA
,其余部分仍然像上面一样工作,将 parent
替换为 parentA
。