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?
+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 –
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