我有一个XML字符串,我无法使用提供的XSD来解组java中的对象。所以我尝试使用在线工具(www.freeformatter.com/xsd-generator.html)生成有效的xsd并得到相同的错误。我不明白我所看到的。
这是XML:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Message xmlns:ns1="http://www.domain.com/ws" xmlns="http://www.domain.com/ws/protocol">
<HeaderMessage>
<MSGTYPE>reply</MSGTYPE>
<ORIGINATOR>XXXX</ORIGINATOR>
<SENDER>XXXX</SENDER>
<TIMESTAMP>2013-12-12 17:48:09.649</TIMESTAMP>
<IDPROCESS>2013-12-12 17:48:09.649</IDPROCESS>
<IDMESSAGE>AN-1386866889649</IDMESSAGE>
<IDREQUEST>AN-1386866889649</IDREQUEST>
<SERVICENAME>RESULT</SERVICENAME>
<ERRORFLAG>OK</ERRORFLAG>
<ERRORCODE>300</ERRORCODE>
<ERRORMSG>Success</ERRORMSG>
</HeaderMessage>
<BodyMessage>
<ns1:ServiceResultObject isin="XX0000000000">
<ns1:ResultObject value="true" codIsin="XX0000000000" />
</ns1:ServiceResultObject>
</BodyMessage>
</Message>
这是我从工具中获得的XSD:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" targetNamespace="http://www.domain.com/ws" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="ServiceResultObject">
<xs:complexType>
<xs:sequence>
<xs:element name="ResultObject">
<xs:complexType>
<xs:simpleContent>
<xs:extension base="xs:string">
<xs:attribute type="xs:string" name="value"/>
<xs:attribute type="xs:string" name="codIsin"/>
</xs:extension>
</xs:simpleContent>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute type="xs:string" name="isin"/>
</xs:complexType>
</xs:element>
</xs:schema>
生成类后,我收到错误
javax.xml.bind.UnmarshalException:意外元素(uri:“http://www.domain.com/ws/protocol”,local:“Message”)。预期的元素是&lt; {{{}}} ServiceResultObject&gt;
为什么我会丢失所有这些标题信息?为什么XSD不会导致实际解组该对象的模式?服务人员提供的XSD也只定义了内部对象。
答案 0 :(得分:1)
由于您的XML文档有2个名称空间(http://www.domain.com/ws/protocol
&amp; http://www.domain.com/ws
),因此您需要2个XML模式来表示它。一个模式可以使用import
元素引用另一个模式。
下面我已经开始了XML所需的XML Schema。
ws.xsd(http://www.domain.com/ws
名称空间)
这是http://www.domain.com/ws
的XML架构的一部分。整个是你已经产生的。
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.domain.com/ws"
xmlns:tns="http://www.domain.com/ws"
elementFormDefault="qualified">
<element name="ServiceResultObject">
<complexType>
<sequence/>
<attribute name="isin" type="string"/>
</complexType>
</element>
</schema>
ws_protocol.xsd(针对http://www.domain.com/ws/protocol
名称空间)
以下是http://www.domain.com/ws/protocol
命名空间缺少的模式的部分版本。请注意引用其他XML模式的import
元素,以及引用其他XML模式中的元素的<element ref="ws:ServiceResultObject"/>
。
<?xml version="1.0" encoding="UTF-8"?>
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.domain.com/ws/protocol"
xmlns:tns="http://www.domain.com/ws/protocol"
xmlns:ws="http://www.domain.com/ws"
elementFormDefault="qualified">
<import namespace="http://www.domain.com/ws" schemaLocation="ws.xsd"/>
<element name="Message">
<complexType>
<sequence>
<element name="HeaderMessage">
<complexType>
<sequence>
<element name="MSGTYPE" type="string"/>
</sequence>
</complexType>
</element>
<element name="BodyMessage">
<complexType>
<sequence>
<element ref="ws:ServiceResultObject"/>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
一旦有了两个XML Schema,这些类将生成2个不同的包。以下是如何引导JAXBContext
的示例。请注意,包名称由:
字符分隔。
JAXBContext jc = JAXBContext.newInstance("com.domain.ws:com.domain.ws.protocol");