2016-07-27 4 views
0

Ich bin die Jackson XmlMapper mit in ein POJO abzubilden und xml, aber ich habe folgendes Problem:Jackson XmlMapper Karte von Kind-Element

Meine XML sieht wie folgt aus (nicht das Original, nur ein Beispiel):

<?xml version="1.0" encoding="UTF-8"?> 
<result> 
    <pojo> 
     <name>test</name> 
    </pojo> 
</result> 

Das Problem ist, ich möchte das "Ergebnis" -Objekt nicht analysieren. Ich möchte den Pojo als eigenes Objekt analysieren. Kann ich das mit XmlMapper machen?

danke!

Artur

Antwort

1

Sie es tun können, aber Sie müssen einige Kesselblech Code schreiben. Sie müssen eine Instanz von XMLStreamReader erstellen, um das benutzerdefinierte Lesen Ihrer XML-Eingabe vornehmen zu können. Die Methode next() ermöglicht es, zum nächsten Analyseereignis des Lesers zu gehen. Es ist eher eine knifflige Methode() in Bezug auf die internen Regeln des Lesers. So lesen Sie die Dokumentation zu verstehen Besonderheiten:

Vom Javadoc:
int javax.xml.stream.XMLStreamReader.next() throws XMLStreamException

nächste Parsing Ereignis Get - ein Prozessor kann alle Rück zusammenhängende Zeichendaten in einem einzelnen Chunk, oder es kann in mehrere Chunks aufgeteilt werden. Wenn die Eigenschaft javax.xml.stream.isCoalescing auf "true" gesetzt ist, muss der Inhalt des Elements zusammengeführt werden und für zusammenhängende Elementinhalte oder CDATA-Abschnitte muss nur ein CHARACTERS-Ereignis zurückgegeben werden. Durch Standard-Entity-Referenzen müssen erweitert und transparent an die Anwendung gemeldet werden. Eine Ausnahme wird ausgelöst, wenn eine Entitätsreferenz nicht erweitert werden kann. Wenn der Inhalt des Elements leer ist (d. H. Der Inhalt ist ""), wird kein CHARACTERS-Ereignis gemeldet.

Angesichts der folgenden XML: Inhalt textHello </gruss>]]> andere Inhalte Das Verhalten des nächsten() aufrufen, wenn sie auf foo sein wird: 1- Kommentar (KOMMENTAR) 2- dann der Abschnitt Zeichen (Characters) 3- dann der CDATA-Abschnitt (ein anderes Zeichen) 4- dann der nächsten Zeichen Abschnitt (ein anderes Zeichen) 5- dann die END_ELEMENT

HINWEIS: leeres Element (wie zum Beispiel) wird mit zwei separaten gemeldet Ereignisse: START_ELEMENT, END_ELEMENT - Dadurch wird das Parsen Äquivalenz des leeren Elements zu. Diese Methode löst eine IllegalStateException aus, wenn sie aufgerufen wird, nachdem hasNext() false zurückgegeben hat.

Returns: der Code integer dem aktuellen Parse-Ereignis

Lassen Sie mich erläutern die Art und Weise entspricht, mit einem Gerät zu testen, um fortzufahren:

@Test 
public void mapXmlToPojo() throws Exception { 
    XMLInputFactory factory = XMLInputFactory2.newFactory(); 
    InputStream inputFile = MapXmlToPojo.class.getResourceAsStream("pojo.xml"); 
    XMLStreamReader xmlStreamReader = factory.createXMLStreamReader(inputFile); 
    XmlMapper xmlMapper = new XmlMapper(); 
    xmlStreamReader.next(); 
    xmlStreamReader.next(); 
    Pojo pojo = xmlMapper.readValue(xmlStreamReader, Pojo.class); 
    Assert.assertEquals("test", pojo.getName()); 
} 
Verwandte Themen