这是我的XSD文件的一个简单的摘录
<?xml version="1.0" encoding="UTF-8"?>
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="ns"
xmlns:tns="sns" elementFormDefault="qualified">
<element name="document">
<attribute name="title" use="required"/>
</element>
</schema>
Run Code Online (Sandbox Code Playgroud)
我用它maven-jaxb2-plugin来生成Java类.本Document类有一个getTitle()返回的文本方法title属性.
我想添加一个额外的方法Document:
public String getStrippedTitle() {
return getTitle().replaceAll("\\s+", "");
}
Run Code Online (Sandbox Code Playgroud)
我希望我的额外方法出现在unmarshalled对象上(而不是我只是调用它或编写一个包装类)因为我想将顶级unmarshalled对象传递给一个字符串模板并让它迭代调用我的子元素额外的方法.
我找到了说明,但是他们告诉我设置一个属性,Unmarshaller而我的(Mac OS X,Java 7)实现似乎不支持任何属性.
我该怎么做?
在Brian Henry给出的链接之后,我发现我可以在我的模式文件中内联绑定自定义来执行我想要的操作.效果与Brian的解决方案完全相同,但它不需要引用引用com.sun.xml.internal.
首先,模式文件有所修改:
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="ns"
xmlns:tns="sns" elementFormDefault="qualified"
xmlns:jaxb="http://java.sun.com/xml/ns/jaxb"
jaxb:version="2.0">
<element name="document">
<annotation>
<appinfo>
<jaxb:class implClass="DocumentEx" />
</appinfo>
</annotation>
<attribute name="title" use="required"/>
</element>
</schema>
Run Code Online (Sandbox Code Playgroud)
当模式编译成Java代码时,生成的ObjectFactory将引用DocumentEx而不是Document. DocumentEx是我创建的类,看起来像这样:
public class DocumentEx extends Document {
public String getStrippedTitle() {
return getTitle().replaceAll("\\s+", "");
}
}
Run Code Online (Sandbox Code Playgroud)
Document(我正在扩展的类)仍由schema-to-Java编译器生成.现在,当我解组文档时,我实际上得到了一个DocumentEx对象:
JAXBContext jaxbContext = JAXBContext.newInstance("com.example.xml");
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller();
unmarshaller.setSchema(testSchema);
DocumentEx doc = (DocumentEx)unmarshaller.unmarshal(xmlFile);
Run Code Online (Sandbox Code Playgroud)
在Oracle上有一些(难以解析的)文档以及O'Reilly的一些有用示例.