在JAXB的帮助下,我希望通过重用一些没有JAXB类型/元素注释的现有XML /类来进行一些编组和解组。
是否可以更改默认的JAXB命名映射配置以映射所有标记/字段,例如" firstName-> FirstName"没有引入任何注释?
我的意思是这些类字段(注意:它们以小写字母开头)
class Person {
String firstName;
String lastName;
}
映射到该XML(注意:它们以大写字母开头):
<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
答案 0 :(得分:2)
Jesper建议使用MOXy的替代方法是使用StreamReaderDelegate
和DelegatingXMLStreamWriter
过滤输入和输出xml。
对于解组你可以这样做:
String xml = "<Person><FirstName>John</FirstName><LastName>Doe</LastName></Person>";
XMLStreamReader xsr = XMLInputFactory.newInstance().createXMLStreamReader(new StringReader(xml));
xsr = new StreamReaderDelegate(xsr) {
@Override
public String getLocalName() {
String s = super.getLocalName();
return Character.toLowerCase(s.charAt(0)) + s.substring(1);
}
};
JAXBContext jc = JAXBContext.newInstance(Person.class);
Unmarshaller u = jc.createUnmarshaller();
Person person = u.unmarshal(xsr, Person.class).getValue();
用于marshling的
StringWriter sw = new StringWriter();
XMLStreamWriter xsw = XMLOutputFactory.newInstance().createXMLStreamWriter(sw);
xsw = new DelegatingXMLStreamWriter(xsw) {
@Override
public void writeStartElement(String prefix, String localName, String namespaceURI) throws XMLStreamException {
String s = localName;
super.writeStartElement(prefix, Character.toUpperCase(s.charAt(0)) + s.substring(1), namespaceURI);
}
};
Marshaller m = jc.createMarshaller();
JAXBElement<Person> jaxbElement = new JAXBElement<Person>(new QName(Person.class.getSimpleName()), Person.class, person);
m.marshal(jaxbElement, xsw);
DelegatingXMLStreamWriter
由于某种原因打包私有,但它是一个简单的类,您只需从here复制源。
此解决方案基于this blog post。