2013-05-03 58 views
20

Tôi có một XML được sử dụng để cấu hình một số quy tắc, nó không có cấu trúc phức tạp, nhưng cấu hình này được sử dụng ở bất cứ đâu trong hệ thống của tôi, vì vậy tôi muốn phân tích cú pháp XML này thành đối tượng java và thiết kế như chế độ singleton. cách tôi có thể sử dụng nó để unmarshal XML đối tượng Java trực tiếp mà không cần viết nhiều mã?cách phân tích cú pháp xml thành đối tượng java?

Tôi đã thực hiện một số nghiên cứu về Google và JAXB được biết đến, ứng dụng của tôi chỉ là một số loại chương trình công cụ đọc quy tắc và sau đó làm theo các chất liệu, JAXB có thể được sử dụng rộng rãi cho dịch vụ web.

Nếu có, câu hỏi quan trọng nhất là, tôi đã sử dụng xjc để tạo lớp nguồn đối tượng java theo tệp xsd, sau khi unmarshal tôi sẽ trực tiếp nhận được đối tượng configurationType này, là cần thiết tôi chuyển đổi lần nữa, (từ các lớp JaxB sang sở hữu cấu hình đối tượng java pojo), tôi thấy hầu hết coder đã làm điều này, nhưng tại sao? vì chúng là một số dữ liệu, chỉ từ đối tượng được tạo ra cho JAXB và sao chép vào đối tượng POJO được tạo của chính chúng ta

Trả lời

45

JAXB là một giải pháp lý tưởng. Nhưng bạn không nhất thiết cần xsd và xjc cho điều đó. Thường xuyên hơn bạn không có xsd nhưng bạn biết xml của bạn là gì. Đơn giản chỉ cần phân tích xml của bạn, ví dụ,

<customer id="100"> 
    <age>29</age> 
    <name>mkyong</name> 
</customer> 

Tạo lớp mô hình cần thiết (es):

@XmlRootElement 
public class Customer { 

    String name; 
    int age; 
    int id; 

    public String getName() { 
     return name; 
    } 

    @XmlElement 
    public void setName(String name) { 
     this.name = name; 
    } 

    public int getAge() { 
     return age; 
    } 

    @XmlElement 
    public void setAge(int age) { 
     this.age = age; 
    } 

    public int getId() { 
     return id; 
    } 

    @XmlAttribute 
    public void setId(int id) { 
     this.id = id; 
    } 

} 

Cố gắng unmarshal:

JAXBContext jaxbContext = JAXBContext.newInstance(Customer.class); 
Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); 
Customer customer = (Customer) jaxbUnmarshaller.unmarshal(new File("C:\\file.xml")); 

Kiểm tra kết quả, sửa lỗi!

+0

như vậy trong trường hợp này, tôi có thể sử dụng của khách hàng như POJO trên hệ thống của tôi, tôi không cần phải tạo mới tinh khiết java POJO lớp khách hàng mà không có chú thích ở trong đó? –

+0

Chắc chắn, đây là ý tưởng, bạn đọc một khách hàng từ xml và tiếp tục làm việc với nó như là. –

+0

@ C.c Bạn có thể đánh dấu câu hỏi là đã được giải quyết không? –

3

JAXB là một sự lựa chọn đáng tin cậy vì nó xml đến các lớp java ánh xạ trơn tru. Nhưng cũng có những khuôn khổ khác có sẵn, đây là một ví dụ:

https://code.google.com/p/xmappr/

5

Để thực hiện Unmarshall sử dụng JAXB:

1) Chuyển đổi XML cho XSD (do chính bạn hoặc chuyển đổi trực tuyến),

2) Tạo một dự án JAXB trong nhật thực,

3) Tạo tập tin XSD và dán mà chuyển đổi nội dung XSD trong nó,

4) Nhấp chuột phải vào ** XSD file -> Generate -> JAXB Classes -> làm theo hướng dẫn (điều này sẽ tạo tất cả các tập tin .java nessasary trong src, tức là, một gói-thông tin, nhà máy đối tượng và lớp pojo) ,

5) Tạo tệp .java khác trong src để hoạt động unmarshall hoạt động và chạy nó.

Mã hóa hạnh phúc !!

4

Một điều đó là thực sự quan trọng để hiểu xem xét bạn có một tập tin XML như:

<customer id="100"> 
    <Age>29</Age> 
    <NAME>mkyong</NAME> 
</customer> 

Tôi rất tiếc phải thông báo cho bạn nhưng:

@XmlElement 
public void setAge(int age) { 
    this.age = age; 
} 

sẽ không giúp bạn, vì nó cố gắng để tìm "tuổi" thay vì tên phần tử "Tuổi" từ XML.

tôi khuyến khích bạn phải tự xác định tên nguyên tố phù hợp với một trong file XML:

@XmlElement(name="Age") 
public void setAge(int age) { 
    this.age = age; 
} 

Và nếu bạn có ví dụ:

@XmlRootElement 
@XmlAccessorType (XmlAccessType.FIELD) 
public class Customer { 
... 

Nó có nghĩa là nó sẽ sử dụng đậu java bởi mặc định và tại thời điểm này nếu bạn chỉ định rằng bạn không được đặt một số khác

@XmlElement(name="NAME") 

chú thích phía trên phương thức setter cho một phần tử <NAME>..</NAME> nó sẽ không nói rằng không thể có hai phần tử trên một biến duy nhất.

Tôi hy vọng điều đó sẽ hữu ích.

+0

Làm thế nào bạn có thể làm tương tự với các yếu tố mặt trời có cùng tên? Một cái gì đó như http://stackoverflow.com/questions/41875849/how-to-utilize-jaxb-for-object-serialization-for-sub-elements-with-same-tag-name – Jesse

Các vấn đề liên quan