JAXB更改默认命名转换器
问题描述:
在JAXB的帮助下,我想通过重用一些现有的XML /类而不使用JAXB类型/元素注释来进行一些编组和解组。JAXB更改默认命名转换器
是否可以更改默认的JAXB命名映射配置来映射所有标记/字段,如“firstName-> FirstName”而不引入任何注释?
我的意思是这些类字段(注:他们开始用小写字母)
class Person {
String firstName;
String lastName;
}
映射到XML(注:他们开始用大写字母):
<Person>
<FirstName>John</FirstName>
<LastName>Doe</LastName>
</Person>
答
替代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();
而且simillary为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。
+0
谢谢,@Oleg。奇迹般有效。我认为某种xml预处理/转换可能会完成这项工作,但这是更好的解决方案。 –
我不认为JDK中的JAXB实现可以做到这一点。如果您使用EclipseLink MOXy等替代实现,这可能是可能的。请参阅:[自定义XML名称转换](http://www.eclipse.org/eclipselink/documentation/2.6/moxy/advanced_concepts002.htm#CHDCCCAF) – Jesper
谢谢,@Jesper。我看到这个注解'XMLNameTransformer'可以完成这项工作,但不想引入新的库依赖关系。 –