В настоящее время я использую JAXB для генерации классов Java, чтобы разобрать XML. Теперь я хотел бы создать новую схему, очень похожую на первую, и создать классы, которые генерируют один и тот же интерфейс.
Скажем, например, у меня есть два файла схемы, которые определяют 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, я хотел бы сгенерировать два файла класса:
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()
.
Я просмотрел некоторые из документации для сопоставления интерфейсов, но это, по-видимому, относится только к ситуации, когда у вас уже есть классы Java, которые вы хотите сопоставить DOM.
Кроме того, я пытался использовать этот внешний плагин, но он не работает. Вот мой файл привязки 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, но это похоже на то, что плагин-плагин не получает из класса pathpath:
$ 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
Любые идеи?