2012-01-15 28 views
5

Tôi có hai lớp học có mối quan hệ với nhau như dưới đây. Tôi có một danh sách các đối tượng ObjReal nơi toàn bộ dữ liệu được trình bày. Tôi muốn lưu toàn bộ Danh sách vào xml mà không làm mất các mối quan hệ đối tượng. Tôi có nghĩa là một đối tượng đại diện trong XML nên có objStrucs tương ứng của họ cùng với nó. Để lưu trữ ObjReal vào xml là thẳng về phía trước nhưng tôi đang nhận được nhầm lẫn với quan hệ ObjStruc của nó. Xin vui lòng helpe để giải quyết vấn đề này.Làm thế nào tôi có thể lưu trữ ArrayList của các đối tượng phức tạp vào xml?

My ObjReal là:

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

} 

My ObjStruc là:

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

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

} 

Và dữ liệu hoàn chỉnh là trong ArrayList<ObjReal> obreals đối tượng mà tôi muốn để đổ vào xml. Tôi hy vọng tôi giữ một điểm rõ ràng. Cảm ơn trước.

Trả lời

2

Chỉ cần nạp nó vào XStream! Nó hoạt động theo cả hai cách. Đoạn mã here. Chúc may mắn!

3

Có một số thư viện sẽ sắp xếp các cấu trúc đối tượng thành xml. Một trong số đó là XStream. Có một hướng dẫn dễ dàng và nhanh chóng here.

+0

Rất thú vị ... Tôi sẽ bỏ phiếu này! – aviad

0

JAXB (Java Architecture for XML Binding) được cho là cách lý tưởng để chuyển đổi các đối tượng Java sang XML, và lấy chúng trở lại một lần nữa:

+0

IMO, JAXB hơi lỗi thời và không tiện dụng và trực quan như những người khác (XStream) – aviad

+2

+1 cho JAXB (không chắc tại sao @aviad lại bỏ phiếu cho bạn).Đây là một bài viết tôi đã viết so sánh JAXB và XStream: http://blog.bdoughan.com/2010/10/how-does-jaxb-compare-to-xstream.html. Đây là một bài viết khác tôi đã viết một số điều mới thú vị đang được thực hiện trong EclipseLink JAXB (Tôi là người dẫn đầu về công nghệ): http://blog.bdoughan.com/2011/09/mapping-objects-to-multiple-xml -schemas.html –

+0

@Blaise Doughan cảm ơn nhận xét của bạn và đã chia sẻ liên kết tới blog của bạn. Rất thú vị! – aviad

4

Lưu ý: Tôi là người lãnh đạo EclipseLink JAXB (MOXy) và là thành viên của số JAXB 2 (JSR-222) nhóm chuyên gia.

Có một vài khía cạnh thú vị của trường hợp sử dụng của bạn:

  1. ArrayList như đối tượng gốc
  2. mối quan hệ hai chiều giữa ObjRealObjStruc

1. ArrayList AS ROOT OBJECT

Triển khai JAXB (MOXy, Metro, Ja xMe, vv) không cung cấp hỗ trợ trực tiếp để xử lý các loại Collection làm đối tượng gốc. Để xử lý trường hợp sử dụng này, bạn chỉ cần tạo lớp bao bọc có trường mong muốn Collection làm trường/thuộc tính.

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

    private ArrayList<ObjReal> objReals;   

} 

2. hai chiều RELATIOSNHIP

Bạn có thể sử dụng phần mở rộng @XmlInverseReference trong việc thực hiện EclipseLink của JAXB để xử lý các mối quan hệ hai chiều trong mô hình của bạn. Dưới đây tôi đã bao gồm một ví dụ hoàn chỉnh. Tôi đã bỏ qua hầu hết các phương thức truy cập để tiết kiệm không gian.

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

Các @XmlInverseReference chú thích được sử dụng trên lớp này. Trên chú thích này, bạn chỉ định tên fied/tài sản cho một hướng khác của mối quan hệ:

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

Để xác định MOXY là nhà cung cấp JAXB của bạn, bạn cần phải bao gồm một tập tin gọi jaxb .properties với các nội dung sau đây trong cùng một gói như các lớp miền của bạn:

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

Demo

Bạn có thể chạy các đoạn mã sau để xác minh các bản đồ:

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 (input.xml)

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

Output

Dưới đây là sản phẩm từ chạy mã trình diễn. Như bạn có thể thấy objReal tài sản trên mỗi ObjStruc đối tượng được dân cư trong unmarshal:

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

Để biết thêm thông tin

Tải EclipseLink

Bạn có thể tải EclipseLink tại địa chỉ:

1

Bất kỳ cách dễ dàng để viết một đối tượng java để xml là sử dụng bộ mã hóa java xml . Điều này viết toàn bộ đối tượng của bạn và phụ thuộc của nó vào định dạng xml. Sau đó bạn có thể đọc lại chúng vào đối tượng của bạn.

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; 
} 
Các vấn đề liên quan