生成的XSD不会解组XML

时间:2013-12-13 10:49:23

标签: java xml jaxb xsd generated

我有一个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也只定义了内部对象。

1 个答案:

答案 0 :(得分:1)

由于您的XML文档有2个名称空间(http://www.domain.com/ws/protocol&amp; http://www.domain.com/ws),因此您需要2个XML模式来表示它。一个模式可以使用import元素引用另一个模式。

XML Schemas

下面我已经开始了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>

创建JAXBContext

一旦有了两个XML Schema,这些类将生成2个不同的包。以下是如何引导JAXBContext的示例。请注意,包名称由:字符分隔。

JAXBContext jc = JAXBContext.newInstance("com.domain.ws:com.domain.ws.protocol");