2016-07-01 8 views
0

Ich möchte JAXB für die Zuordnung XML-Datei zum Objekt verwenden.Wie XML mit JAXB zu analysieren?

<Contract> 
    <Variable Name="Address"> 
     <Value>Address</Value> 
    </Variable> 
    <Variable Name="FirstName"> 
     <Value>First</Value> 
    </Variable> 
    <Variable Name="SecondName"> 
     <Value>Second</Value> 
    </Variable> 
    <Parameter Name="id"> 
     <Value>399425</Value> 
    </Parameter> 
    <Parameter Name="isComplete"> 
     <Value>True</Value> 
    </Parameter> 
    <Parameter Name="templateName"> 
     <Value>Probate Application</Value> 
    </Parameter> 
</Contract> 

Um Java-Objekt wie folgt aus::

public class Contract { 
    private Long id; 
    private String templateName; 
    private boolean isComplete; 
    private Map<String, String> answers = new HashMap<>(); 

} 

Oder vielleicht beraten einige Tutorial für diese, wie XML-Datei wie folgt zu konvertieren. Danke

+0

[Dies] (http://www.mkyong.com/java/jaxb-hello-world-example/) scheint relevant zu sein. – user5226582

+0

@Sviatlana Wenn Sie * IntelliJ IDEA * verwenden, können Sie [Generieren von Java-Code aus XML-Schema] (https://www.jetbrains.com/help/idea/2016.1/generating-java-code-from-xml- schema.html) posten. –

+0

Es wird nicht in der Community unterstützt. – Sviatlana

Antwort

1

Sie haben zwei Probleme: Bindung der <Variable> Element an Ihre Karte und Bindung der <Parameter> Elemente an verschiedene typisierte Objekte.

Ich werde die Probleme in dieser Reihenfolge behandeln. Für die Karte müssen Sie XmlAdapter mit @XmlJavaTypeAdapter verwenden.

-Code eine Klasse Ihr <Variable> Element darstellt und wo es sich:

public class Variable{ 

    @XmlAttribute 
    public String Name; 

    @XmlElement 
    public String Value; 

    //Getters and setters 
} 

dann die XMLAdapter Code:

public class YourAdapter extends XmlAdapter<List<Variable>,Map<String,String>>{ 

    public Map<String,String> unmarshall(List<Variable> arg0){ 
     //Logic to convert a List<Variable> into a Map<String,String> and return it 
    } 

    public List<Variable> marshall(Map<String,String> arg0){ 
     //Logic to convert a Map<String,String> into a List<Variable> and return it 
    } 


} 

Dann Karte Ihre Vertragsklasse:

@XmlRootElement 
@XmlSeeAlso({Variable.class}) 
public class Contract{ 

    @XmlElement(name="Variable") 
    @XmlJavaTypeAdapter(YourAdapter.class) 
    private Map<String,String> map; 

    //Getters and setters 
} 

Damit Deine Karte sollte funktionieren.

Sie haben zwei Lösungen mit Ihrem zweiten Problem: Entweder Verwenden der JAXB-Referenzimplementierung oder Verwenden der JAXB MOXy-Implementierung.

Mit JAXB Referenzimplementierung

JAXB Referenzimplementierung kann nicht Xpath verwenden seine Bindung zu tun. Also hier ist ein Workaround.

-Code eine zweite Klasse und Adapter für Ihr <Parameter> Element, das im Wesentlichen mit Ausnahme des Namen die gleiche Sache sein wird, und diese Zuordnung für den Objektbereich:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlSeeAlso({Variable.class,Parameter.class}) 
public class Contract{ 

    @XmlElement(name="Variable") 
    @XmlJavaTypeAdapter(YourAdapter.class) 
    private Map<String,String> map; 

    @XmlElement(name="Parameter") 
    @XmlJavaTypeAdapter(YourAdapterForParameter.class) 
    private Map<String,String> parameterMap; 

    public Long getId(){ 
      return Long.valueOf(parameterMap.get("id")); 
    } 

    public void setId(Long id){ 
      parameterMap.put("id",id.toString()); 
    } 

    //Same thing for other getters/setters 
} 

Mit moxy Implementierung

Mit moxy Implementierung können Sie @XmlPath und XPath verwenden es ein bisschen sauberer zu machen:

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
@XmlSeeAlso({Variable.class}) 
public class Contract{ 

    @XmlPath("./Variable[@Name='id']/Value") 
    private Long id; 

    @XmlPath("./Variable[@Name='templateName']/Value") 
    private String templateName; 

    @XmlPath("./Variable[@Name='isComplete']/Value") 
    private boolean isComplete; 

    @XmlElement(name="Variable") 
    @XmlJavaTypeAdapter(YourAdapter.class) 
    private Map<String,String> map; 

    //Getters and setters 
} 

Weitere Informationen/Hilfe finden Sie in der JAXB/MOXy Dokumentation.

+0

Ich danke Ihnen von ganzem Herzen! – Sviatlana

+0

Gern geschehen;) –