通过从另一个xsd进行选择性元素替换来解组xsd

时间:2019-04-08 09:02:52

标签: xsd jaxb unmarshalling

我刚接触xsd和jaxb,因此,如果我的问题不清楚,请教育我。另外,如果您需要更多信息,请告诉我,我会尽力提供。

在我们公司,我们正在与来自第三方的xsd来源合作。我们需要实现SOAP-Java转换,并且有很多.wsdl和.xsd文件可以使用。我们遇到了两个.xsd文件的问题。第三方提供一个带有 org .hl7.v3名称空间的“ datatypes.xsd”和一个带有 nl .hl7的“ datatypes-extensions-hl7nl.xsd”。 .v3命名空间。

当我解组xds源时,将在不同的程序包下创建生成的.java文件,这些程序包以其自己的命名空间命名:org / hl7 / v3和nl / hl7 / v3。

鉴于第三方的意图,在适用的情况下,“ datatypes-extensions.xsd”中的类型具有优先级,因此应取代“ datatypes.xsd”中的类型并在同一程序包中生成。

到目前为止我尝试过的事情

由于我无法更改xsd源,因此我(未成功)使用.jxb文件尝试了两种方法。

1:在单个目录中生成.java文件。这导致了覆盖问题。

2:提供指向正确类型的绑定:

<jaxb:bindings schemaLocation="../coreschemas/datatypes.xsd">
        <jaxb:bindings node="//xs:complexType[@name='TEL']">
            <jaxb:class ref="nl.hl7.v3.TEL"/>
        </jaxb:bindings>
    </jaxb:bindings>

这最初是可行的,直到我更改了超类型的引用为止,此时编译器抱怨无法为扩展类型找到合适的超类型。

来源

资源是开源的,因此,如果您想亲自查看它们:https://decor.nictiz.nl/pub/vzvz/kz-vzvz-xml-20190122T131422.zip

.wsdl:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:xsd="http://www.w3.org/2001/XMLSchema"
             xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
             xmlns="http://schemas.xmlsoap.org/wsdl/"
             xmlns:hl7="urn:hl7-org:v3"
             targetNamespace="urn:hl7-org:v3"
             name="OpvragenOverdrachtconcerns">
   <documentation> WSDL implementatie van OpvragenOverdrachtconcerns</documentation>
   <types>
      <xsd:schema targetNamespace="urn:hl7-org:v3" elementFormDefault="qualified">
         <xsd:include schemaLocation="../schemas_codeGen/REPC_IN990110NL.xsd"/>
      </xsd:schema>
      <xsd:schema targetNamespace="urn:hl7-org:v3" elementFormDefault="qualified">
         <xsd:include schemaLocation="../schemas_codeGen/REPC_IN990111NL.xsd"/>
      </xsd:schema>
   </types>
   <message name="REPC_IN990110NL">
      <part name="body" element="hl7:REPC_IN990110NL"/>
   </message>
   <message name="REPC_IN990111NL">
      <part name="body" element="hl7:REPC_IN990111NL"/>
   </message>

响应消息类型的标题:REPC_IN990111NL:

<?xml version="1.0" encoding="UTF-8"?>
<!-- REPC_IN990111NL - Opleveren overdrachtconcerns --><!--Note: this file was generated. DO NOT EDIT HERE.--><xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="urn:hl7-org:v3"
           targetNamespace="urn:hl7-org:v3"
           elementFormDefault="qualified">

datatypes.xsd中冲突类型的标题和定义:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:hl7="urn:hl7-org:v3" xmlns:hl7nl="urn:hl7-nl:v3"
    xmlns:sch="http://www.ascc.net/xml/schematron" elementFormDefault="qualified" targetNamespace="urn:hl7-org:v3" xmlns="urn:hl7-org:v3">
    <xsd:include schemaLocation="voc.xsd"/>
    <xsd:import namespace="urn:hl7-nl:v3" schemaLocation="datatypes-extensions-hl7nl.xsd"/>
<xsd:complexType name="TEL">
        <xsd:complexContent>
            <xsd:extension base="URL">
                <xsd:sequence>
                    <xsd:element name="useablePeriod" type="IVL_TS" minOccurs="0"
                        maxOccurs="unbounded">
                        <!-- FIXME: one would expect the name "GTS" here but it's not
          SXCM does ALL the right things, it's just not the right NAME. -->
                    </xsd:element>
                    <xsd:element name="id" type="II" minOccurs="0"/>
                </xsd:sequence>
                <xsd:attribute name="use" type="set_cs_TelecommunicationAddressUse" use="optional">
                </xsd:attribute>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

标头和类型为datatypes-extension-hl7nl.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" xmlns:hl7="urn:hl7-org:v3" xmlns="urn:hl7-nl:v3" xmlns:sch="http://purl.oclc.org/dsdl/schematron" targetNamespace="urn:hl7-nl:v3">
    <xsd:import schemaLocation="datatypes.xsd" namespace="urn:hl7-org:v3"/>
<xsd:complexType name="TEL">
        <xsd:complexContent>
            <xsd:extension base="ANY">
                <xsd:sequence>
                    <xsd:element name="useablePeriod" type="QSET_TS" minOccurs="0"/>
                </xsd:sequence>
                <xsd:attribute name="value" type="xsd:anyURI" use="optional"/>
                <xsd:attribute name="use" type="set_TelecommunicationAddressUse" use="optional"/>
                <xsd:attribute name="capabilities" type="set_TelecommunicationCapability" use="optional"/>
            </xsd:extension>
        </xsd:complexContent>
    </xsd:complexType>

预期结果和实际结果

如上所述,而不是根据不同的命名空间生成两个包,而应使用“ nl.hl7.v3”类型创建一个同名的“ org.hl7.v3”类型。

谢谢您的时间。

最大

0 个答案:

没有答案