2012-08-15 42 views
1

我需要一個POJO轉換成以下XML:定義XML結構西河

<Root> 
    <Version>2.0</Version> 
    <Name>John</Name> 
    <Age>18</Age> 
    <UserId>22491</UserId> 
    <Country>USA</Country> 
    <AnotherData> 
    <Records> 
     <AnotherRecord> 
     <Field1>XXX</Field1> 
     <Field2>XX</Field2> 
     <Field3>CCCCCCCC</Field3> 
     <Field4>XXX9000</Field4> 
     <Field5>XXX00345</Field5> 
     </AnotherRecord> 
    </Records> 
    </AnotherData> 
</Root> 

我知道如何將字段轉換根標籤的下方,這不是一個問題。但從AnotherData我的問題的開始。

爲了表示上面的XML我需要一些類是這樣的:

puclic class Root{ 
    public String Version; 
    public String Name; 
    public String Age; 
    public String UserID; 
    public String Country; 
    public AnotherData AnotherData; 
} 

public class AnotherData{ 
    public Records Records; 
} 

public class Records{ 
    List<AnotherRecord> list; 
} 

public class AnotherRecord{ 
    public String Field1; 
    public String Field2; 
    public String Field3; 
    public String Field4; 
    public String Field5; 
} 

但我不需要類的這個結構,我想實現一個更簡單的模式我的課,而「力」 XML中的標籤結構。

我的類將如下所示,但保持像上面那樣的結構xml。

puclic class Root{ 
    public String Version; 
    public String Name; 
    public String Age; 
    public String UserID; 
    public String Country; 
    public AnotherData AnotherData; 
    List<AnotherRecord> list; 
} 

public class AnotherRecord{ 
    public String Field1; 
    public String Field2; 
    public String Field3; 
    public String Field4; 
    public String Field5; 
} 
+0

什麼你已經使用XStream試試?我不明白你確切的問題是什麼。 – migu 2012-08-15 13:47:48

+0

此用例可以使用EclipseLink JAXB(MOXy)的「@ XmlPath」擴展名輕鬆映射(請參閱:http://blog.bdoughan.com/2010/09/xpath-based-mapping-geocode-example.html( 。請讓我知道如果你有興趣在演示如何完成這個例子。 – 2012-08-15 15:00:02

+0

使用另一個XML庫是一個選項嗎?我會推薦[SimpleXML](http://simple.sourceforge.net/)。它更簡單比XStream更容易。 – davidbuzatto 2012-08-19 15:53:20

回答

1

注:我是EclipseLink JAXB (MOXy)鉛和JAXB (JSR-222)專家小組的成員。

我不認爲這個用例可以被XStream處理。如果您願意使用其他技術,下面是如何使用MOXY完成的一個例子。使用@XmlPath擴展名。

@XmlPath("AnotherData/Records/AnotherRecord") 
List<AnotherRecord> list; 

下面是完全映射Root類會是什麼樣子。 JAXB不需要任何註釋(請參閱:http://blog.bdoughan.com/2012/07/jaxb-no-annotations-required.html),但由於文檔中的XML元素與默認命名規則不匹配,因此需要一些註釋。

package forum11970410; 

import java.util.List; 
import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.XmlPath; 

@XmlRootElement(name="Root") 
public class Root{ 
    @XmlElement(name="Version") 
    public String Version; 

    @XmlElement(name="Name") 
    public String Name; 

    @XmlElement(name="Age") 
    public String Age; 

    @XmlElement(name="UserId") 
    public String UserID; 

    @XmlElement(name="Country") 
    public String Country; 

    @XmlPath("AnotherData/Records/AnotherRecord") 
    List<AnotherRecord> list; 
} 

AnotherRecord

package forum11970410; 

import javax.xml.bind.annotation.XmlElement; 

public class AnotherRecord{ 
    @XmlElement(name="Field1") 
    public String Field1; 

    @XmlElement(name="Field2") 
    public String Field2; 

    @XmlElement(name="Field3") 
    public String Field3; 

    @XmlElement(name="Field4") 
    public String Field4; 

    @XmlElement(name="Field5") 
    public String Field5; 
} 

jaxb.properties

要指定莫西爲您的JAXB提供者,你需要在同一個包添加一個名爲jaxb.properties文件作爲您的域名班,以下條目(請參閱:http://blog.bdoughan.com/2011/05/specifying-eclipselink-moxy-as-your.html):

javax.xml.bind.context.factory=org.eclipse.persistence.jaxb.JAXBContextFactory 

演示

您可以使用下面的演示代碼來證明一切正常:

package forum11970410; 

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

public class Demo { 

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

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum11970410/input.xml"); 
     Root root = (Root) unmarshaller.unmarshal(xml); 

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

} 

輸入。XML /輸出

<?xml version="1.0" encoding="UTF-8"?> 
<Root> 
    <Version>2.0</Version> 
    <Name>John</Name> 
    <Age>18</Age> 
    <UserId>22491</UserId> 
    <Country>USA</Country> 
    <AnotherData> 
     <Records> 
     <AnotherRecord> 
      <Field1>XXX</Field1> 
      <Field2>XX</Field2> 
      <Field3>CCCCCCCC</Field3> 
      <Field4>XXX9000</Field4> 
      <Field5>XXX00345</Field5> 
     </AnotherRecord> 
     </Records> 
    </AnotherData> 
</Root> 

更多信息