首页 文章

生成的XSD不会解组XML

提问于
浏览
1

我有一个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”) . 预期的元素是<{http://www.domain.com/ws} ServiceResultObject>

为什么我丢失了所有这些 Headers 信息?为什么XSD不会导致实际解组该对象的模式?服务人员提供的XSD也只定义了内部对象 .

1 回答

  • 1

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

    XML Schema

    下面我已经开始了XML所需的XML Schema .

    ws.xsd (for http://www.domain.com/ws namespace)

    这是 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 (for http://www.domain.com/ws/protocol namespace)

    以下是 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");
    

相关问题