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 ”,本地:“消息”)。预期的元素是 <{ http://www.domain.com/ws }ServiceResultObject>

为什么我会丢失所有这些标头信息?为什么 XSD 不会产生实际上解组对象的模式?这里服务人员提供的 XSD 也只定义了内部对象。

4

1 回答 1

1

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

XML 模式

下面我开始了您的 XML 所需的 XML 模式。

ws.xsd(用于http://www.domain.com/ws命名空间)

这是http://www.domain.com/ws. 整个是你已经生成的。

<?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。请注意import引用其他 XML 模式<element ref="ws:ServiceResultObject"/>的元素,以及引用其他 XML 模式中的元素的元素。

<?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 模式,这些类将生成 2 个不同的包。下面是一个如何引导JAXBContext. 请注意,包名称由:字符分隔。

JAXBContext jc = JAXBContext.newInstance("com.domain.ws:com.domain.ws.protocol");
于 2013-12-13T11:16:39.717 回答