2012-01-15 34 views
5

我有這些相互具有如下關係兩類。我有一個ObjReal對象的列表,其中顯示了整個數據。我想將整個List保存到xml中而不會丟失對象關係。我的意思是用XML表示的對象應該有它們相應的objStruc。 要存儲ObjReal成XML是直線前進,但我得到其ObjStruc關係混淆。請幫助解決這個問題。如何將複雜對象的ArrayList存儲到xml中?

我ObjReal是:

Class ObjReal 
{ 
    private String id; 
    private String data; 

    ArrayList<ObjStruc> objStrucs=new ArrayList<ObjStruc>(); 

    public ArrayList<ObjStruc> getObjStrucs() 
    { 
     return objStrucs; 
    } 

    public String getId() 
{ 
     return id; 
} 

    public String getData() 
    { 
     return data; 
    } 

    public void setId(String id) 
    { 
     this.id=id; 
    } 
    public void setData(String data) 
    { 
     this.data=data; 
    } 

} 

我ObjStruc是:

Class ObjStruc 
{ 
    private ObjReal objReal; 
    public ObjReal getObjReal() 
{ 
     return objReal; 
} 

    public ObjReal setObjReal(ObjReal objReal) 
    { 
     this.objReal=objReal; 
    } 

} 

而完整的數據是ArrayList<ObjReal> obreals對象,我想轉儲到XML。我希望我保持清楚的一點。提前致謝。

回答

2

它只是喂XStream! 它適用於兩種方式。代碼片段here。 祝你好運!

3

有幾個庫,將serialiaze對象結構的XML。其中之一是XStream。有一個簡單而快速的教程here

+0

非常有趣......我會把它投票! – aviad 2012-01-15 08:10:30

0
+0

IMO,JAXB已經過時了,並不像其他人那樣方便和直觀(XStream) – aviad 2012-01-15 08:12:07

+2

JAXB的+1(不知道爲什麼@aviad下了你投票)。這裏是我寫的比較JAXB和XStream的文章:http://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-xstream.html。這裏是我寫的另一篇文章,演示了EclipseLink JAXB中的一些令人興奮的新事物(我是技術負責人):http://blog.bdoughan.com/2011/09/mapping-objects-to-multiple-xml -schemas.html – 2012-01-15 11:47:36

+0

@Blaise Doughan感謝您的評論並分享鏈接到您的博客。很有意思! – aviad 2012-01-17 08:32:26

4

注意:我是EclipseLink JAXB (MOXy)鉛和中的一員專家組。

有你的使用情況,一對夫婦有趣的方面:​​

  1. 的ArrayList作爲根對象
  2. 雙向關係ObjRealObjStruc之間

1 ArrayList的AS根對象

JAXB實現(MOXY,地鐵,JA xMe等)不提供將Collection類型作爲根對象的直接支持。要處理這種用例,您只需創建一個包含所需的Collection作爲字段/屬性的包裝類。

@XmlRootElement(name="root-element-name") 
@XmlAccessorType(XmlAccessType.FIELD) 
public class ListWrapper { 

    private ArrayList<ObjReal> objReals;   

} 

2.雙向RELATIOSNHIP

可以使用@XmlInverseReference擴展在執行的EclipseLink JAXB的處理模型中的雙向關係。下面我列出了一個完整的例子。我省略了大多數訪問器方法來節省空間。

ObjReal

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

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
class ObjReal { 

    private String id; 
    private String data; 
    ArrayList<ObjStruc> objStrucs=new ArrayList<ObjStruc>(); 

    public ArrayList<ObjStruc> getObjStrucs() { 
    return objStrucs; 
    } 

} 

ObjStruc

@XmlInverseReference註釋用於在這個類。在這個註解你的關係的另一個方向指定田間/屬性名稱:

import javax.xml.bind.annotation.*; 
import org.eclipse.persistence.oxm.annotations.XmlInverseReference; 

@XmlAccessorType(XmlAccessType.FIELD) 
class ObjStruc { 

    @XmlInverseReference(mappedBy="objStrucs") 
    private ObjReal objReal; 

    public ObjReal getObjReal() { 
     return objReal; 
    } 

} 

jaxb.properties

要指定莫西爲您的JAXB提供你需要包括一個名爲JAXB的.properties在同一個包的以下內容作爲你的域類:

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

演示

可以運行下面的代碼來驗證映射:

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

public class Demo { 

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

     Unmarshaller unmarshaller = jc.createUnmarshaller(); 
     File xml = new File("src/forum8868303/input.xml"); 
     ObjReal objReal = (ObjReal) unmarshaller.unmarshal(xml); 

     for(ObjStruc objStruc : objReal.getObjStrucs()) { 
      System.out.println(objStruc.getObjReal()); 
     } 

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

} 

輸入(input.xml中)

<?xml version="1.0" encoding="UTF-8"?> 
<objReal> 
    <id>123</id> 
    <data>some data</data> 
    <objStrucs/> 
    <objStrucs/> 
</objReal> 

輸出

下面是從輸出運行演示代碼。正如你可以看到每個ObjStruc對象的objReal財產解組期間填充:

[email protected] 
[email protected] 
<?xml version="1.0" encoding="UTF-8"?> 
<objReal> 
    <id>123</id> 
    <data>some data</data> 
    <objStrucs/> 
    <objStrucs/> 
</objReal> 

更多信息

下載的EclipseLink

您可以在下載的EclipseLink:

1

任何簡單的方法來寫一個Java對象到XML是使用的Java XML編碼器。這會將整個對象及其依賴項寫入xml格式。然後,您可以將它們讀回到您的對象中。

public static boolean writeXMLFile(final Object data, final String fileName) { 

    XMLEncoder encoder = null; 

    boolean result = true; 

    try { 
     encoder = new XMLEncoder(new BufferedOutputStream(new FileOutputStream(fileName))); 
     encoder.writeObject(data); 
    } catch (final IOException e) { 
     logger.error(e.getMessage()); 
     result = false; 
    } finally { 
     if (encoder != null) { 
      encoder.close(); 
     } else { 
      result = false; 
     } 
    } 

public static Object readXMLFile(final String fileName) { 

    XMLDecoder decoder = null; 
    Object data = null; 

    try { 
     FileInputStream fis = new FileInputStream(fileName); 
     BufferedInputStream bis = new BufferedInputStream(fis); 
     decoder = new XMLDecoder(bis); 
     data = decoder.readObject(); 
    } catch (final FileNotFoundException e) { 
     data = null; 
     logger.error(e.getMessage()); 
    } catch (final Exception e) { 
     data = null; 
     logger.error(e.getMessage()); 
    } finally { 
     if (decoder != null) { 
      decoder.close(); 
     } else { 
      data = null; 
     } 
    } 

    return data; 
} 
相關問題