替代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。
我不認爲JDK中的JAXB實現可以做到這一點。如果您使用EclipseLink MOXy等替代實現,這可能是可能的。請參閱:[自定義XML名稱轉換](http://www.eclipse.org/eclipselink/documentation/2.6/moxy/advanced_concepts002.htm#CHDCCCAF) – Jesper
謝謝,@Jesper。我看到這個註解'XMLNameTransformer'可以完成這項工作,但不想引入新的庫依賴關係。 –