我需要使用特定格式的JAXB从java对象生成XML:
<message xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://mynamespace.org/message">
<header>
<name>Message</name>
<id>randomUUID</id>
</header>
<body>
<messagecontent xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://mynamespace.org/messagecontent">
<object id="randomUUID" type="form">
<formular xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://mynamespace.org/formular">
<name>Username</name>
<address>UserAddress</address>
</formular>
<object>
</messagecontent>
</body>
</message>
对于这个类型的xml文档,我在java中有3个对象:
消息:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "message", propOrder = {
"header",
"body"
})
@XmlRootElement(name = "message",namespace="http://mynamespace.org/message")
public class Message {
@XmlElement(name = "header")
private Message.Header header;
@XmlElement(name = "body")
private Message.Body body;
public Header getHeader() {
return header;
}
public void setHeader(Header header) {
this.header= header;
}
public Body getBody() {
return body;
}
public void setBody(Body body) {
this.body= body;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "header", propOrder = {
"name",
"id"
})
public static class Header {
@XmlElement(name = "name")
private String name;
@XmlElement(name = "id")
private String id;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "body", propOrder = {
"msgContent",
})
public static class Body {
@XmlElement(name = "messagecontent")
private MessageContent msgContent;
public MessageContent getMsgContent() {
return msgContent;
}
public void setMsgContent(MessageContent msgContent) {
this.msgContent = msgContent;
}
}
}
在messageContent:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "messagecontent", propOrder = {
"object"
})
@XmlRootElement(name = "messagecontent",namespace="http://mynamespace.org/messagecontent")
public class MessageContent{
@XmlElement(name = "object")
private Object object;
public Object getObject() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "object", propOrder = {
"id",
"type",
"formular"
})
public static class Object {
@XmlAttribute(name = "id")
private String id;
@XmlAttribute(name = "type")
private String type;
@XmlElement(name = "formular")
private Formular formular;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public Formular getFormular() {
return formular;
}
public void setFormular(Formular formular) {
this.formular = formular;
}
}
}
表现公式:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "formular", propOrder = {
"name",
"address"
})
@XmlRootElement(name = "formular",namespace="http://mynamespace.org/formular")
public class Formular {
@XmlElement(name = "name")
private String name;
@XmlElement(name = "address")
private String address;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
使用此代码从此对象:
private static void writeToSysOut(Message obj) {
String result = null;
try {
JAXBContext context = JAXBContext.newInstance(Message.class);
Marshaller m = context.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, Boolean.TRUE);
StringWriter writer = new StringWriter();
m.marshal(new JAXBElement<Message>(new QName("message"), Message.class, obj), writer);
result = writer.toString();
} catch (JAXBException e) {
System.out.println(e);
}
System.out.println(result);
}
我收到了这个XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message xmlns:ns2="http://mynamespace.org/formular" xmlns:ns4="http://mynamespace.org/message" xmlns:ns3="http://mynamespace.org/messagecontent">
<header>
<name>TestXML</name>
<id>123456789</id>
</header>
<body>
<messagecontent>
<object id="23456789" type="msgType">
<formular>
<name>Some name</name>
<address>Some address</address>
</formular>
</object>
</messagecontent>
</body>
</message>
如何更改anotation以获取具有在特定属性中定义的命名空间的xml,如示例XML中所示。我需要具有这种特定格式,因为我使用的其他部分如果不是这种特定格式,则不能处理XML。感谢