這種類型的情況下是常見的:
下面是一個辦法可以這樣做:
消息模式 - message.xsd
有一個XML架構來表示你的郵件信封。引入一種類型來表示消息的主體。這種類型將通過不同的有效載荷進行擴展。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.example.org/message"
xmlns="http://www.example.org/message"
elementFormDefault="qualified">
<xsd:element name="message">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="body" type="body"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:complexType name="body">
</xsd:complexType>
</xsd:schema>
有效載荷架構 - customer.xsd
該模式對應於一個特定類型的消息有效載荷的。注意客戶類型如何從消息模式擴展正文類型。
<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema
targetNamespace="http://www.example.org/customer"
xmlns="http://www.example.org/customer"
xmlns:m="http://www.example.org/message"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xsd:import schemaLocation="message.xsd" namespace="http://www.example.org/message"/>
<xsd:complexType name="customer">
<xsd:complexContent>
<xsd:extension base="m:body">
<xsd:sequence>
<xsd:element name="name" type="xsd:string"/>
</xsd:sequence>
</xsd:extension>
</xsd:complexContent>
</xsd:complexType>
</xsd:schema>
org.example.message.package-信息
從message.xsd產生這個類。
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/message", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package org.example.message;
org.example.message.Message
這個類是從message.xsd生成。
package org.example.message;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "", propOrder = {
"body"
})
@XmlRootElement(name = "message")
public class Message {
@XmlElement(required = true)
protected Body body;
public Body getBody() {
return body;
}
public void setBody(Body value) {
this.body = value;
}
}
org.example.message.Body
這個類是從message.xsd生成。
package org.example.message;
import javax.xml.bind.annotation.*;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "body")
public class Body {
}
org.example.customer.package-信息
從customer.xsd生成這個類。
@javax.xml.bind.annotation.XmlSchema(namespace = "http://www.example.org/customer", elementFormDefault = javax.xml.bind.annotation.XmlNsForm.QUALIFIED)
package org.example.customer;
org.example.customer。客戶
該類由customer.xsd生成。
package org.example.customer;
import javax.xml.bind.annotation.*;
import org.example.message.Body;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "customer", propOrder = {
"name"
})
public class Customer extends Body {
@XmlElement(required = true)
protected String name;
public String getName() {
return name;
}
public void setName(String value) {
this.name = value;
}
}
演示類
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;
import org.example.customer.*;
import org.example.message.*;
public class Demo {
public static void main(String[] args) throws Exception {
JAXBContext jc = JAXBContext.newInstance(Message.class, Customer.class);
Message message = new Message();
Customer customer = new Customer();
customer.setName("Jane Doe");
message.setBody(customer);
Marshaller marshaller = jc.createMarshaller();
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
marshaller.marshal(message, System.out);
}
}
輸出
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<message xmlns="http://www.example.org/message" xmlns:ns2="http://www.example.org/customer">
<body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="ns2:customer">
<ns2:name>Jane Doe</ns2:name>
</body>
</message>
EDIT#1
在回答您的開環nd問題(Cast JAXB2 generated object to JAXBElement?)
我沒有看到JAXBElement在這個例子中發揮了什麼作用。我能夠運行下面的代碼:
import generated.GetFailedLoginCount;
import ietf.params.xml.ns.netconf.base._1.RpcType;
public class Demo {
public static void main(String[] args) {
RpcType rpc = new RpcType();
rpc.setMessageId("123");
GetFailedLoginCount rpcOperation = new GetFailedLoginCount();
rpc.setRpcOperation(rpcOperation);
}
}
編輯#2
改變進口導入到http://www.iana.org/assignments/xml-registry/schema/netconf.xsd我看到了相同的行爲,你先請。
要正確設置屬性,你需要做的是這樣的:
RpcType rpc = new RpcType();
GetFailedLoginCount rpcOperation = new GetFailedLoginCount();
rpcOperation.setReset(true);
JAXBElement<GetFailedLoginCount> rpcOperationJE = new JAXBElement(new QName("foo"), GetFailedLoginCount.class, rpcOperation);
rpc.setRpcOperation(rpcOperationJE);
的JAXBElement爲GetFailedLoginCount值提供元素名稱。這是必需的,因爲對應rpcOperation屬性的元素替代:
<xs:element name="get-config" type="getConfigType" substitutionGroup="rpcOperation" />
在你的模式,它的進口netconf.xsd你應該有類型的元素「得到失敗的登錄數」,它可以取代「rpcOperation」。這將作爲QName提供給JAXBElement。因爲我們使用的元素名稱爲「foo」架構更新上面看起來像:
<xs:element name="foo" type="get-failed-login-count" substitutionGroup="rpcOperation" />
是有辦法做到#1的XSD?對於#2,它看起來像你有所有3個選項相同... – wuntee 2010-08-25 21:25:40
我已經更新了我的答案,包括一個例子。 – 2010-08-26 16:00:05
我還在我的博客上發佈了一個示例,其中消息對象具有Object類型的屬性,並利用@XmlAnyElement註釋來整理有效內容:http://bdoughan.blogspot.com/2010/08/using-xmlanyelement -to-build-generic.html – 2010-08-26 18:52:34