2017-08-08 117 views
1

在JAXB的幫助下,我想通過重用一些現有的XML /類而不使用JAXB類型/元素註釋來進行一些編組和解組。JAXB更改默認命名轉換器

是否可以更改默認的JAXB命名映射配置來映射所有標記/字段,如「firstName-> FirstName」而不引入任何註釋?

我的意思是這些類字段(注:他們開始用小寫字母)

class Person { 
    String firstName; 
    String lastName; 
} 

映射到XML(注:他們開始用大寫字母):

<Person> 
    <FirstName>John</FirstName> 
    <LastName>Doe</LastName> 
</Person> 
+0

我不認爲JDK中的JAXB實現可以做到這一點。如果您使用EclipseLink MOXy等替代實現,這可能是可能的。請參閱:[自定義XML名稱轉換](http://www.eclipse.org/eclipselink/documentation/2.6/moxy/advanced_concepts002.htm#CHDCCCAF) – Jesper

+0

謝謝,@Jesper。我看到這個註解'XMLNameTransformer'可以完成這項工作,但不想引入新的庫依賴關係。 –

回答

2

替代Jesper建議使用MOXy的方法是使用StreamReaderDelegateDelegatingXMLStreamWriter來過濾輸入和輸出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預處理/轉換可能會完成這項工作,但這是更好的解決方案。 –