2017-05-04 2 views
1

Da XML in den folgenden (vereinfacht) Format:Deserialize inneren Teil von XML in neue Klasseninstanz

<outer><inner><field1>a</field1><field2>b</field2><field3>c</field3></inner></outer> 

Ich möchte das <inner> Element in eine Klasse deserialisieren dass darstellt und den Rest zu verwerfen.

public class Inner { 
    private String field1; 
    private String field2; 
    private String field3; 
    // getters, setters, ctor 
} 

Ich bin mit dem Jackson XmlMapper Klasse die Deserialisierung auszuführen. Wenn ich <outer> aus der XML-Zeichenfolge streife, funktioniert es offensichtlich.

XmlMapper xmlMapper = new XmlMapper(); 
// in my scenario the `<inner>` element actually contains fields I don't care about 
xmlMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); 
Inner inner = xmlMapper.readValue(xml, Inner.class); 
System.out.println(inner); 
// Inner(field1=a, field2=b, field3=c) 

Wenn ich verlassen das <outer> Element alle Felder in inner null sind.

Ich habe versucht, die Inner Klasse mit @JacksonXmlRootElement(localName = "inner") annotieren, aber das hat die Ausgabe nicht geändert.

Ich könnte eine Klasse erstellen, die das <outer> Element darstellt, aber das scheint verschwenderisch. Ich könnte wahrscheinlich auch eine neue Zeichenfolge erstellen, die nur die Xml zwischen den <inner> Elemente enthält, aber auch das fühlt sich ein bisschen hacky.

In meinem Fall wird die XML von einem separaten System gesendet, das ich nicht kontrollieren kann, also kann ich einfach die XML-Struktur ändern.

Ist es möglich, das "innere" XML in eine neue Klasseninstanz zu deserialisieren?

Antwort

1

Es scheint, dass für @JacksonXmlRootElement(localName = "inner") zu arbeiten, wie Sie erwarten, dass Sie auch UNWRAP_ROOT_VALUE benötigen. Z.B.

xmlMapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE); 

Ich kann nicht sagen, das Obige ist sehr offensichtlich aus der Dokumentation.

+0

Danke. Es scheint, dass Feature der Schlüssel war. –