2013-04-05 27 views
5

Tôi hiện đang sử dụng JAXB để phân tích các tệp xml. Tôi tạo ra các lớp cần thiết thông qua một tập tin xsd. Tuy nhiên, các tệp xml tôi nhận được không chứa tất cả các nút được khai báo trong các lớp được tạo ra. Sau đây là một ví dụ về cấu trúc file xml của tôi:Xử lý các nút bị thiếu với JAXB

<root> 
<firstChild>12/12/2012</firstChild> 
<secondChild> 
<firstGrandChild> 
<Id> 
    </name> 
    <characteristics>Description</characteristics> 
    <code>12345</code> 
</Id> 
</firstGrandChild> 
</secondChild> 
</root> 

Tôi đang phải đối mặt với hai trường hợp sau:

  1. Nút <name> hiện diện trong các lớp được tạo ra nhưng không phải trong các tập tin XML
  2. Nút không có giá trị

Trong cả hai trường hợp, giá trị được đặt thành rỗng. Tôi muốn có thể phân biệt khi nút không có trong tệp XML và khi nó hiện diện nhưng có giá trị null. Mặc dù tìm kiếm của tôi, tôi đã không tìm ra cách để làm như vậy. Bất kỳ sự giúp đỡ là chào đón nhiều hơn

Cảm ơn bạn rất nhiều trước cho thời gian của bạn và giúp

Trân

+0

xsi: nil là bạn của bạn! đọc thêm ở đây http://stackoverflow.com/questions/774192/what-is-the-correct-way-to-represent-null-xml-elements – MariuszS

+0

Cảm ơn bạn đã trả lời của bạn! Như tôi đã hiểu, điều này là để thiết lập giá trị của nút thành "" thay vì null. Vấn đề mà tôi đang phải đối mặt là đối với JAXB, một nút rỗng và một nút không tồn tại trong tệp xml được xử lý theo cùng một cách. Vì vậy, tôi không thể biết liệu tôi đã nhận được nút trong tệp hay tôi đã làm và giá trị của nó là null – user2249868

+0

Ví dụ sau sẽ giúp với 'xsi: nil': http://blog.bdoughan.com/2012/04/binding -to-json-xml-handling-null.html –

Trả lời

3

Một thực hiện JAXB (JSR-222) sẽ không gọi phương thức thiết lập cho các nút vắng mặt. Bạn có thể đặt logic trong phương pháp thiết lập của bạn để theo dõi có hay không nó đã được gọi.

public class Foo { 

    private String bar; 
    private boolean barSet = false; 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
     this.barSet = true; 
    } 

} 

CẬP NHẬT

JAXB cũng sẽ đối xử với các nút rỗng như có một giá trị rỗng String.

Java Mẫu

import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Root { 

    private String foo; 
    private String bar; 

    public String getFoo() { 
     return foo; 
    } 

    public void setFoo(String foo) { 
     this.foo = foo; 
    } 

    public String getBar() { 
     return bar; 
    } 

    public void setBar(String bar) { 
     this.bar = bar; 
    } 

} 

Demo

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/forum15839276/input.xml"); 
     Root root = (Root) unmarshaller.unmarshal(xml); 

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

} 

input.xml/Output

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<root> 
    <foo></foo> 
</root> 
+0

Tôi cần xử lý tương tự cho kiểu dữ liệu BigInteger và các bộ sưu tập, nhưng đối với BigInteger cờ boolean luôn luôn là false –

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