如何配置XSD以将XML映射到具有不同名称

时间:2018-02-15 13:23:22

标签: java xsd jaxb xsd2code xmlmapper

我们要求XML标记与java POJO属性不相似。

我们需要一个解决方案,将XML标签映射到具有不同名称的POJO。

这是相同的XML,

<RES>
     <TAG1>
       value
     </TAG1>
</RES>

这是POJO类,

public class Response {
    protected String tag1Value;
...}

这里我要映射到POJO中的tag1Value。

我发现下面的语法可用于将XML映射到java属性。

public class Response {
     @XmlElement(name="TAG1")
    protected String tag1Value;
...}

但我想知道如何在XSD中配置它,以便可以在XMLElement中使用name属性生成POJO。

使用以下XSD如何一起指定java属性名称和XML nae,

<xsd:element name="tag1Value" minOccurs="0" maxOccurs="1">

帮助表示赞赏......

2 个答案:

答案 0 :(得分:0)

您可以通过自定义指定架构的jaxb绑定来实现:

(我假设您的xsd看起来如何,但如果我错了,您可以调整目标节点的路径)

<jxb:bindings schemaLocation="../xsd/your_schema.xsd">
        <jxb:bindings node="//xs:element[@name='Response']//xs:complexType//xs:all//xs:element[@name='tag1Value']">
            <annox:annotate target="field">
                <annox:annotate annox:class="javax.xml.bind.annotation.XmlElement" name="TAG1" />
            </annox:annotate>
        </jxb:bindings>
</jxb:bindings>

答案 1 :(得分:0)

这就是绑定的目的。

创建一个名为bindings.xjb的文件(xjb按惯例是文件扩展名)。在此文件中,您可以自定义代码生成的某些方面。例如,您可以使用jaxb:property在生成的类中指定属性的名称:

<jaxb:bindings version="1.0" xmlns:jaxb="http://java.sun.com/xml/ns/jaxb" 
    xmlns:xs="http://www.w3.org/2001/XMLSchema" 
    xmlns:xjc="http://java.sun.com/xml/ns/jaxb/xjc" 
    jaxb:extensionBindingPrefixes="xjc">

    <jaxb:bindings 
        schemaLocation="mySchema.xsd" 
        node="/xs:schema">

        <!-- node is the XPath leading to the element you want to customize -->
        <jaxb:bindings node="xs:complexType[@name='SomeComplexType']/xs:sequence/xs:element[@name='TAG1']">
            <jaxb:property name="tag1Value"/>
        </jaxb:bindings>
    </jaxb:bindings>

</jaxb:bindings>

您可以在编译期间使用xjc mySchema.xsd -b bindings.xjb或使用Maven插件或Ant任务的配置选项(无论您使用什么)提供此文件。

这将生成名为tag1Value的属性,该属性将使用@XmlElement(name="TAG1")进行注释。