我们假设我有这个类,我想使用JAXB生成XML文件
public class Document{
private String id;
private Date signatureDate;
here goes Constructor, getters and setters
}
当我生成XML文件时,我会得到类似这样的内容
`<document>
<id>id3</id>
<signatureDate>1970-01-01T01:00:00+01:00</signatureDate>
</documento>`
现在我想用更多元素包装该类的每个属性:例如表示属性的类型。
`<document>
<id>
<paperid>
<string>id3<string>
<paperid>
<id>
<signatureDate>
<signatureYearDayAndHour>
<date>1970-01-01T01:00:00+01:00</date>
</signatureYearDayAndHour>
</signatureDate>
</documento>`
最终目标必须用不同的xmlElement包装类的每个属性。
答案 0 :(得分:0)
我不相信您可以使用JAXB来应用像您这样的自定义元映射规则。 JAXB定义了它自己的具体XML / POJO映射规则,并且仅支持Java类型,命名空间以及bindings.xjb
文件和xjc
工具的官方文档中讨论的其他相对简单的自定义。
但是,您可以做的是设置XML解析管道,以便在XML事件到达JAXB解组之前应用筛选。这就是你在JAXP中连接自定义过滤器的方法:
JAXBContext jc = JAXBContext.newInstance(Document.class);
XMLFilter filter = new MyFilter();
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
filter.setParent(sp.getXMLReader());
Unmarshaller unmarshaller = jc.createUnmarshaller();
UnmarshallerHandler unmarshallerHandler =
unmarshaller.getUnmarshallerHandler();
filter.setContentHandler(unmarshallerHandler);
filter.parse(inputsource);
这是通用过滤器实现的样子(注意这只是作为身份过滤器;我已经将实现自定义映射规则作为练习:)
class MyFilter extends XMLFilterImpl {
@Override
public void startElement(String uri, String localName, String qName, Attributes atts)
throws SAXException {
super.startElement(uri, localName, qName, atts);
}
@Override
public void endElement(String uri, String localName, String qName)
throws SAXException {
super.endElement(uri, localName, qName);
}
}
为了让您了解过滤器的可能性,请参阅例如。 https://www.ibm.com/developerworks/community/forum/html/topic?id=60ef4f89-701a-447a-9375-3880115eb65a和 http://blog.bdoughan.com/2012/11/applying-namespace-during-jaxb-unmarshal.html。
最后,请注意,要使用类型信息注释XML元素,已经建立了使用xsi:type
属性的约定,因此您可能希望拥抱它并更改设计而不是创建自己的映射规则。