2012-06-27 52 views
32

私は以下のXMLを持っており、それをJavaオブジェクトに変換する必要があります。jaxb(unmarshal)を使用してxmlをjavaオブジェクトに変換

<tests> 
    <test-data> 
     <title>BookTitle</title> 
     <book>BookName</book> 
     <count>64018</count> 
     <test-data> 
      <title>Book title1</title> 
      <book>Book Name1</book> 
      <count>5</count> 
     </test-data> 
     <test-data> 
      <title>Book title2</title> 
      <book>Book Name3</book> 
      <count>5</count> 
     </test-data> 
     <test-data> 
      <title>Book title3</title> 
      <book>Book Name3</book> 
      <count>4</count> 
     </test-data> 
    </test-data> 
</tests> 

JAXBを使用して変換すると、私のpojoはどうなるでしょうか。

は、私は私の理解あたりとして、次のPOJOを作成:

public class Tests { 

    TestData testData; 

    public TestData getTestData() { 
     return testData; 
    } 

    public void setTestData(TestData testData) { 
     this.testData = testData; 
    } 
} 

public class TestData { 
    String title; 
    String book; 
    String count; 

    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    public String getBook() { 
     return book; 
    } 
    public void setBook(String book) { 
     this.book = book; 
    } 
    public String getCount() { 
     return count; 
    } 
    public void setCount(String count) { 
     this.count = count; 
    } 
} 

が私を助けてください。 ありがとうございます。

+2

あなたはわかりません。しかし、何か試しましたか?すでに何かをしていると助けが簡単です。 – buc

+2

このXML用のXSDをお持ちの場合は、EclipseのようなIDEを使用してJAXB注釈付きクラスを生成できます。 –

答えて

116

たちは@XmlRootElement注釈を追加しますTestsクラスで

をテストします。これを行うと、JAXBの実装で、ドキュメントがこの要素で始まるときにこのクラスをインスタンス化する必要があることがわかります。 JAXBは設定による例外です。つまり、マッピングがデフォルトと異なるアノテーションを追加するだけです。 testDataプロパティがデフォルトマッピングと異なるため、@XmlElementアノテーションを使用します。あなたは、次のチュートリアルが参考に見つけること:http://wiki.eclipse.org/EclipseLink/Examples/MOXy/GettingStarted

package forum11221136; 

import javax.xml.bind.annotation.*; 

@XmlRootElement 
public class Tests { 

    TestData testData; 

    @XmlElement(name="test-data") 
    public TestData getTestData() { 
     return testData; 
    } 

    public void setTestData(TestData testData) { 
     this.testData = testData; 
    } 

} 

TESTDATA

をこのクラスでは、私は要素がで注文する順序を指定する@XmlType注釈を使用し、私はそのtestDataプロパティを追加しました。行方不明に見えた。 Testsクラスと同じ理由で@XmlElement注釈も使用しました。

package forum11221136; 

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

@XmlType(propOrder={"title", "book", "count", "testData"}) 
public class TestData { 
    String title; 
    String book; 
    String count; 
    List<TestData> testData; 

    public String getTitle() { 
     return title; 
    } 
    public void setTitle(String title) { 
     this.title = title; 
    } 
    public String getBook() { 
     return book; 
    } 
    public void setBook(String book) { 
     this.book = book; 
    } 
    public String getCount() { 
     return count; 
    } 
    public void setCount(String count) { 
     this.count = count; 
    } 
    @XmlElement(name="test-data") 
    public List<TestData> getTestData() { 
     return testData; 
    } 
    public void setTestData(List<TestData> testData) { 
     this.testData = testData; 
    } 
} 

以下のデモは、(アンマーシャリング)XMLを読み、自分のドメインモデルを投入してから書き込むようにJAXB APIを使用する方法の例(マーシャル)バックXMLに結果です。

package forum11221136; 

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

public class Demo { 

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

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum11221136/input.xml"); 
     Tests tests = (Tests) unmarshaller.unmarshal(xml); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(tests, System.out); 
    } 

} 
+24

あなたがそれを読んだら、この答えを受け入れるべきです。 –

+0

XMLをスキーマを持たないJavaオブジェクトにUnmarhalling - Reflectionを使用しますか?はいの場合、アンマーシャリングでのReflectionの役割は何ですか? – Viswa

関連する問題