2012-12-04 33 views
5

Tôi đang cố gắng unmarshal một tệp xml bằng cách sử dụng JAXB. Khi tôi đang sử dụng @XmlElement với tên và không gian tên chính xác, các công trình chưa sửa đổi (ví dụ: @XmlElement (name = "name", namespace = "http://www.test.com"))Unmarshalling xml với JAXB - namespace với XmlType và proporder

Nếu tôi sử dụng XmlType cùng nhau với propOrder nó không may không còn nữa (ví dụ: @XmlType (namespace = "http://www.test.com", tên = "", propOrder = {"name", "description"})).

Nội dung của tập tin xml (test.xml):

<Operation xmlns="http://www.test.com"> 
    <Parameter> 
    <name>Param1</name> 
    <description>Description of Parameter1</description> 
    </Parameter> 
    <Parameter> 
    <name>Param2</name> 
    <description>Description of Parameter2</description> 
    </Parameter> 
</Operation> 

Nội dung của JAXBExample.java là:

package stackoverflow.problem.jaxb.ns; 

import java.io.FileNotFoundException; 
import java.io.FileReader; 

import javax.xml.bind.JAXBContext; 
import javax.xml.bind.JAXBException; 
import javax.xml.bind.Unmarshaller; 

public class JAXBExample { 

    public static void main(String[] args) throws JAXBException, FileNotFoundException { 
    String xmlFilename = "test.xml"; 

    JAXBContext context = JAXBContext.newInstance(Operation.class); 

    System.out.println("Output from our XML File: "); 
    Unmarshaller um = context.createUnmarshaller(); 
    Operation op = (Operation) um.unmarshal(new FileReader(xmlFilename)); 

    System.out.println("Operation-Content: " + op); 
    } 

} 

Nội dung của

gói stackoverflow.problem. jaxb.ns;

import java.util.List; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 


@XmlRootElement(name="Operation", namespace="http://www.test.com") 
@XmlAccessorType(XmlAccessType.FIELD) 

public class Operation { 

    @XmlElement(name = "Parameter", namespace="http://www.test.com") 
    List<Parameter> parameterList; 

    @Override 
    public String toString(){ 
    String retVal = ""; 
    for(Parameter currentParameter: parameterList){ 
     retVal += currentParameter.toString() + "\n"; 
    } 
    return retVal; 
    } 
} 

Và nội dung của Parameter.java là:

package stackoverflow.problem.jaxb.ns; 

import javax.xml.bind.annotation.XmlAccessType; 
import javax.xml.bind.annotation.XmlAccessorType; 
import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 
import javax.xml.bind.annotation.XmlType; 

@XmlType(namespace="http://www.test.com", name = "", propOrder = {"name", "description"}) 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Parameter { 

    //@XmlElement(name = "name", namespace="http://www.test.com") 
    String name; 

    //@XmlElement(name = "description", namespace="http://www.test.com") 
    String description; 

    @Override 
    public String toString(){ 
    return this.name + "\t" + this.description; 
    } 
} 

Nếu tôi bỏ ghi chú hai dòng @XmlElement trong khối mã cuối cùng (Parameter.java), các unmarshalling hoạt động tốt. Nếu hai dòng này không được bao gồm, cả hai trường trong đối tượng Parameter là null. Có cách nào khác để khai báo một không gian tên khi sử dụng propOrder trong XmlType? Hay tôi đã làm điều gì khác sai?

Trả lời

5

Các namespace cũng có thể được định nghĩa cho mỗi gói, trong một tập tin có tên package-info.java, bằng cách này bạn không cần phải lặp lại nó trên tất cả các lớp học hoặc lĩnh vực:

@javax.xml.bind.annotation.XmlSchema (
    namespace = "http://www.test.com", 
    elementFormDefault=javax.xml.bind.annotation.XmlNsForm.QUALIFIED 
) 
package stackoverflow.problem.jaxb.ns; 
+2

+1 - Để biết thêm thông tin về JAXB và không gian tên thấy: http://blog.bdoughan.com/2010/08/jaxb-namespaces.html –

+1

Chỉ cần chỉ ra nó: nó không chỉ làm cho mã ít lộn xộn hơn bởi không cần phải đặt nó trong mọi lĩnh vực, nó cũng giải quyết vấn đề sử dụng không gian tên trong propOrder. – Exocom

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