我目前正在使用JAXB生成Java类以便解组XML。现在我想创建一个与第一个非常相似的新模式,并让生成的类实现相同的接口。生成实现接口的JAXB类
比方说,我有一个定义XML类似代码的两条架构文件:
adult.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Age" type="xs:integer" />
<xs:element name="Job" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
kid.xsd
<?xml version="1.0" encoding="UTF-8"?>
<xs:element name="Person">
<xs:complexType>
<xs:sequence>
<xs:element name="Name" type="xs:string" />
<xs:element name="Age" type="xs:integer" />
<xs:element name="School" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
使用JAXB和XJC我” d喜欢生成两个类文件:
public class Adult implements Person {
...
public String getName() { ... }
public int getAge() { ... }
public String getJob { ... }
}
public class Kid implements Person {
...
public String getName() { ... }
public int getAge() { ... }
public String getSchool { ... }
}
其中Person接口定义了getName()
和getAge()
方法。
我已经看过一些documentation的映射接口,但这似乎只适用于当您已经有想要映射到DOM的Java类的情况。
此外,我试过使用这external plugin,但它似乎没有工作。这里是我的XJB绑定文件:
<jxb:bindings version="1.0"
xmlns:jxb="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"
xmlns:ext="http://xml.w-wins.com/xjc-plugins/interfaces"
jxb:extensionBindingPrefixes="xjc">
<jxb:bindings schemaLocation="xsd/adult.xsd" node="xs:schema/xs:complexType[@name='Person']">
<ext:interface>mypackage.Hello</ext:interface>
</jxb:bindings>
</jxb:bindings>
但这提供了以下错误:
$ java -cp "lib/activation.jar;lib/InterfacesXJCPlugin.jar;lib/jaxb1-impl.jar;lib/jaxb-api.jar;lib/jaxb-xjc.jar;lib/jsr173_1.0_api.jar" com.sun.tools.xjc.XJCFacade -p mypackage.myxml -extension -Xinterfaces xsd/adult.xsd -b binding.xjb
parsing a schema...
[ERROR] XPath evaluation of "xs:schema/xs:complexType[@name='Person']" results in empty target node
line 8 of file:/C:/dev/jaxb/jaxb-ri/binding.xjb
Failed to parse a schema.
是否有可能生成JAXB类实现接口?
更新
我使用Interface Insertion插件尝试,但由于某种原因不能得到它的工作。这就是我打电话XJC但它是因为如果该插件罐子是没有得到从classpath回升:
$ java -cp "lib/xjc-if-ins.jar;lib/jaxb-xjc.jar" com.sun.tools.xjc.XJCFacade -p mypackage -extension -Xifins myschema.xsd -b binding.xjb
我得到的错误:
unrecognized parameter -Xifins
任何想法?
Interface Insertion插件可用于使从XSD元素生成的类实现特定的接口。这里你想根据模式名称生成一个类 - 你需要另一个插件来完成。 我已经使用maven成功地完成了界面插入工作。让我知道你是否需要细节。 接口插入的来源在这里:https://jaxb2-commons.dev.java.net/interface-insertion/xjc-if-ins-src.jar – rochb 2009-11-13 16:43:45