Java 常见嵌套类型的JAXB绑定

Java 常见嵌套类型的JAXB绑定,java,data-binding,jaxb,xsd,xjc,Java,Data Binding,Jaxb,Xsd,Xjc,我必须从我无法控制的外部系统中解组和处理XML。XML是我认为的俄罗斯玩偶格式,它不便于处理 XML共享在公共XSD文件中声明的公共类型。但是,当JABX为这些类型生成JAVA类时,每个外部类都包含公共类型的嵌套声明,这使得它们在JAVA方面具有不同的类型 我希望使用公共JAVA函数来处理XML中的公共嵌套类型,但这不起作用,因为在JAXB类中,这些公共类型是不相关的 这使得我需要处理这些常见类型的JAVA代码非常混乱,我一直在尝试使用JAXB绑定来解决这个问题。但是我没有成功。所以我的问题是:

我必须从我无法控制的外部系统中解组和处理XML。XML是我认为的俄罗斯玩偶格式,它不便于处理

XML共享在公共XSD文件中声明的公共类型。但是,当JABX为这些类型生成JAVA类时,每个外部类都包含公共类型的嵌套声明,这使得它们在JAVA方面具有不同的类型

我希望使用公共JAVA函数来处理XML中的公共嵌套类型,但这不起作用,因为在JAXB类中,这些公共类型是不相关的

这使得我需要处理这些常见类型的JAVA代码非常混乱,我一直在尝试使用JAXB绑定来解决这个问题。但是我没有成功。所以我的问题是: 给定这种XML/XSD格式,可以通过绑定或其他方法生成通用类型的JAVA代码吗?

这就是一个例子

XMLClassA和CLASSB中有两个类。两者都包含一个复杂类型,其中一个值为testTYPE类型,即字符串。XSD是:

CLASSA.XSD

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:nstype="http://www.test.com/nstypes"
elementFormDefault="qualified">
<xs:import namespace="http://www.test.com/nstypes" schemaLocation="nstypes.xsd"/>
    <xs:element name="CLASSA">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Prop" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="PROP" minOccurs="0">
                                <xs:complexType>
                                    <xs:sequence>   
                                        <xs:element name="Value" type="nstype:testTYPE" minOccurs="0"/>
                                    </xs:sequence>  
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>  
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    </xs:schema>
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:nstype="http://www.test.com/nstypes"
elementFormDefault="qualified">
<xs:import namespace="http://www.test.com/nstypes" schemaLocation="nstypes.xsd"/>
    <xs:element name="CLASSB">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="Prop" minOccurs="0">
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name="PROP" minOccurs="0">
                                <xs:complexType>
                                    <xs:sequence>   
                                        <xs:element name="Value" type="nstype:testTYPE" minOccurs="0"/>
                                    </xs:sequence>  
                                </xs:complexType>
                            </xs:element>
                        </xs:sequence>  
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
    </xs:schema>
我实际上想做的是实现函数printClass()。我猜这将需要一个org.generated.TestTYPE,所有JAXB类都将使用org.generated.TestTYPEs ratehr而不是org.generated.CLASSA.TestTYPEs生成。 我希望这可以通过一些绑定魔法来实现。如果有人能给我指出正确的方向,我将不胜感激

<>我有C++,而不是java背景,所以如果我的一些术语不正确,请道歉。< /P> Jérôme


这是我想看到的,但从xjc我看到了CLASSA

public CLASSA.Prop getProp()
其中CLASSA.Prop是包含

protected CLASSA.Prop.PROP  
这是另一个包含

 protected TestTYPE value;
TestTYPE是一个

org.generated.CLASSA.TestTYPE   
CLASSB中的TestTYPE是一个

org.generated.CLASSB.TestTYPE
由于两个TestTYPE嵌套在不同的类中,因此它们是不同的类型

实际上,在运行xjc时,我得到两个包含TestTYPE类的文件:

CLASSA/TestTYPE.JAVA

//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2012.09.07 at 07:45:23 AM BST 
//

package org.generated.CLASSA;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;


/**
* <p>Java class for testTYPE complex type.
* 
* <p>The following schema fragment specifies the expected content contained within this class.
* 
* <pre>
* &lt;complexType name="testTYPE">
*   &lt;simpleContent>
*     &lt;extension base="&lt;http://www.test.com/nstypes>BASETYPE">
*     &lt;/extension>
*   &lt;/simpleContent>
* &lt;/complexType>
* </pre>
* 
* 
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "testTYPE")
public class TestTYPE
    extends BASETYPE
{


}

and 
xjc *.xsd
//
//该文件由JDK 6中的JavaTM XML绑定体系结构(JAXB)参考实现vJAXB 2.1.10生成
//看
//重新编译源架构时,对此文件的任何修改都将丢失。
//生成日期:2012.09.07英国夏令时上午7:45:23
//
包org.generated.CLASSA;
导入javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.XmlType;
/**
*testTYPE复杂类型的Java类。
* 
*以下架构片段指定此类中包含的预期内容。
* 
* 
*complexType name=“testTYPE”>
*simpleContent>
*扩展基=”http://www.test.com/nstypes>基本类型“>
*/分机>
*/simpleContent>
*/complexType>
* 
* 
* 
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=“testTYPE”)
公共类TestTYPE
扩展基类型
{
}
及
CLASSB/TestTYPE.JAVA

//
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.10 in JDK 6 
// See <a href="http://java.sun.com/xml/jaxb">http://java.sun.com/xml/jaxb</a> 
// Any modifications to this file will be lost upon recompilation of the source schema. 
// Generated on: 2012.09.07 at 07:45:23 AM BST 
//

package org.generated.CLASSA;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlType;


/**
* <p>Java class for testTYPE complex type.
* 
* <p>The following schema fragment specifies the expected content contained within this class.
* 
* <pre>
* &lt;complexType name="testTYPE">
*   &lt;simpleContent>
*     &lt;extension base="&lt;http://www.test.com/nstypes>BASETYPE">
*     &lt;/extension>
*   &lt;/simpleContent>
* &lt;/complexType>
* </pre>
* 
* 
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "testTYPE")
public class TestTYPE
    extends BASETYPE
{


}

and 
xjc *.xsd
//
//该文件由JDK 6中的JavaTM XML绑定体系结构(JAXB)参考实现vJAXB 2.1.10生成
//看
//重新编译源架构时,对此文件的任何修改都将丢失。
//生成日期:2012.09.07英国夏令时上午7:45:23
//
包org.generated.CLASSB;
导入javax.xml.bind.annotation.XmlAccessType;
导入javax.xml.bind.annotation.XmlAccessorType;
导入javax.xml.bind.annotation.XmlType;
/**
*testTYPE复杂类型的Java类。
* 
*以下架构片段指定此类中包含的预期内容。
* 
* 
*complexType name=“testTYPE”>
*simpleContent>
*扩展基=”http://www.test.com/nstypes>基本类型“>
*/分机>
*/simpleContent>
*/complexType>
* 
* 
* 
*/
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name=“testTYPE”)
公共类TestTYPE
扩展基类型
{
}   
给定这种XML/XSD格式,可以使用通用类型的JAVA代码吗 通过绑定或其他方法生成

使用JDK的

将所有文件放在一个目录中,然后执行以下操作:

public CLASSA.Prop getProp()
您将看到它生成文件:

public CLASSA.Prop.PROP getPROP()
您将看到在CLASSA.java中有一个方法调用getProp(),该方法返回一个CLASSA.Prop,您可以对其执行另一个getProp():

在CLASSA中,您有:

在CLASSA.Prop中,您有:


CLASSA.Prop.Prop
中,值的类型是
com.test.nstypes.TestTYPE
,这是您的常见类型,不依赖于CLASSA或CLASSB。

我认为JAXB不会分解这样的代码。 在我看来,更简单的解决方案是编写类Prop的代码,并在绑定文件中定义B.Prop和A.Prop都依赖于同一个类

例如,使用classImpl属性。

这正是我想看到的,但从xjc我在课堂上看到的评论,我会回答谢谢,我会试试,然后再报告!嗨,我已经看过了,我认为这是正确的做法。但这可能行不通。问题是,您只能更改隐藏的实现。getter和setter必须返回CLASSA或CLASSB包中的某些内容,因此它们仍然不是一个常见的java类(我认为)。我已经发布了关于这个问题的另一个问题
xjc *.xsd
parsing a schema...
compiling a schema...
generated\CLASSA.java
generated\CLASSB.java
generated\ObjectFactory.java
com\test\nstypes\BASETYPE.java
com\test\nstypes\ObjectFactory.java
com\test\nstypes\TestTYPE.java
com\test\nstypes\package-info.java
public CLASSA.Prop getProp()
public CLASSA.Prop.PROP getPROP()