2013-04-08 3 views
14

Я уверен, что это один из многих дублированных вопросов, связанных с преобразованиями XML в Java Object. Но я начал эту тему, так как я не мог найти проще или искать более простое решение.Сопоставление XML-объектов с объектами Java

У меня есть xsd [Infact, я его проектирую] и xml. Я хотел бы автоматически отображать данные XML в Java Beans в соответствии с отображением

<tns:SummaryCart xmlns:tns="SummaryCart" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="SummaryCart.xsd"> 
    <SummaryElement type="test"> 
     <order>1</order> 
     <id>A</id> 
     <displayName>A</displayName> 
     <subElements> 
      <order>1</order> 
      <id>Preactivation</id> 
      <displayName>Preactivation</displayName> 
     </subElements> 
     <maxlines>1</maxlines> 
    </SummaryElement> 
</tns:SummaryCart> 

Теперь мои Java классы будут

public class SummaryCart{ 
    private List<SummaryElement> summaryElementList; 
} 
public class SummaryElement { 
    private int order; 
    private String id; 
    private String displayName; 
    private String property; 
    private List<SummaryElement> subElements; 
    private int maxlines; 
    private String type; 
} 

Есть ли простой инструмент/рамки, которые могут автоматически Сопоставьте данные из XML в Java beans [ДОЛЖНЫ поддерживать атрибуты/сопоставление элементов]. Учебник будет хорошим.

Btw, я использую пружинный каркас, если преимущество весны-oxm принято, его приветствуем.

+5

Использование JAXB с аннотациями. [Здесь] (http://jaxb.java.net/tutorial/) - учебник. –

ответ

28

Ниже вы можете сопоставить свой объект с XML, используя JAXB (JSR-222). Реализация входит в JDK/JRE начиная с Java SE 6. JAXB поддерживается Spring (смотри раздел 8.5): http://static.springsource.org/spring-ws/site/reference/html/oxm.html

SummaryCart

import java.util.List; 
import javax.xml.bind.annotation.*; 

@XmlRootElement(name="SummaryCart", namespace="SummaryCart") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class SummaryCart{ 

    @XmlElement(name="SummaryElement") 
    private List<SummaryElement> summaryElementList; 

} 

SummaryElement

import java.util.List; 
import javax.xml.bind.annotation.*; 

@XmlAccessorType(XmlAccessType.FIELD) 
public class SummaryElement { 

    private int order; 
    private String id; 
    private String displayName; 
    private String property; 
    private List<SummaryElement> subElements; 
    private int maxlines; 

    @XmlAttribute 
    private String type; 

} 

Демо-версия

import java.io.File; 
import javax.xml.bind.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(SummaryCart.class); 

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum15881876/input.xml"); 
     SummaryCart sc = (SummaryCart) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "SummaryCart.xsd"); 
     marshaller.marshal(sc, System.out); 
    } 

} 

Input.xml/выход

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<ns2:SummaryCart xmlns:ns2="SummaryCart" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="SummaryCart.xsd"> 
    <SummaryElement type="test"> 
     <order>1</order> 
     <id>A</id> 
     <displayName>A</displayName> 
     <subElements> 
      <order>1</order> 
      <id>Preactivation</id> 
      <displayName>Preactivation</displayName> 
      <maxlines>0</maxlines> 
     </subElements> 
     <maxlines>1</maxlines> 
    </SummaryElement> 
</ns2:SummaryCart> 
+0

Нельзя сказать, что мы используем JDK 5. Да, приложение Legacy. Могу ли я сделать это с помощью Java 5, включив любую из конкретных библиотек, используя Maven. – Reddy

+0

Вот файл pom.xml, который тянет EclipseLink MOXy как JAXB impl (я ведущий MOXy): https://github.com/bdoughan/blog20110819/blob/master/pom.xml –

1

В основном вы хотите unmarshal ваш XML. Вот подробное руководство, в котором описывается, как использовать команду JAXB xjc для generate a Java class from XML Schema. A maven xjc plugin также доступен для вашего удобства.

+1

Вы также можете использовать реализацию JAXB, начиная с классов Java: http://stackoverflow.com/a/15884122/383861 –

+1

Отмечено Blaise. Мое первоначальное понимание вопроса OP заключалось в том, что он хотел генерировать файлы Java из ничего, используя только XSD в качестве отправной точки. Повторно прочитав его, вы правы, кажется, ему просто нужен способ автоматически отображать их. Спасибо за то, что не спустили вниз. :) – Jops

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