2016-07-01 3 views
0

Я хотел бы использовать JAXB для сопоставления файла XML с объектом. Как преобразовать XML-файл, как это:Как анализировать xml с помощью JAXB?

<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> 

Для объекта Java, как это:

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

} 

Или, может посоветовать какой-то учебник для этого. Thank you

+0

[Это] (http://www.mkyong.com/java/jaxb-hello-world-example/) представляется актуальным. – user5226582

+0

@Sviatlana Если вы используете * IntelliJ IDEA *, вы можете посмотреть [Генерирование кода Java из схемы XML] (https://www.jetbrains.com/help/idea/2016.1/generating-java-code-from-xml- schema.html) сообщение. –

+0

Это не поддерживается в Сообществе .. – Sviatlana

ответ

1

У вас есть две проблемы: Связывание <Variable> Элемент вашей карты и привязка элементов <Parameter> к различным типизированным объектам.

Я рассмотрю проблемы в этом порядке.

Для получения карты вы должны будете использовать XmlAdapter с @XmlJavaTypeAdapter.

Код класса, представляющий свой <Variable> элемент и отобразить его:

public class Variable{ 

    @XmlAttribute 
    public String Name; 

    @XmlElement 
    public String Value; 

    //Getters and setters 
} 

Тогда закодировать XMLAdapter:

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 
    } 


} 

Затем сопоставить класс Contract:

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

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

    //Getters and setters 
} 

С этим, ваша карта должна работать.

У вас есть два решения со второй проблемой: либо с использованием реализации JAXB Reference, либо с использованием реализации JAXB MOXy.

С эталонным JAXB реализации

JAXB Reference реализация не может использовать Xpath, чтобы сделать его обязательным. Итак, вот обходной путь.

код второй класс и адаптер для <Parameter> элемента, который в основном собирается быть тем же самым для имен, за исключением, и использовать это отображение для контракта:

@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 
} 

С реализацией Moxy

с внедрением Moxy, вы можете использовать @XmlPath и XPath, чтобы сделать его немного чище:

@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 
} 

За дополнительной информацией/справкой обратитесь к документации JAXB/MOXy.

+0

Благодарю вас всем сердцем! – Sviatlana

+0

Добро пожаловать;) –

Смежные вопросы