2016-06-14 9 views
1

In unserer Organisation, die wir verwenden in der Regel XML-Nachrichten, die wie folgt aussieht: (. Die XSDs verwendet unten)Wie definiert man Namespaced-Elemente in Namespaced-Elementen?

<sev:serviceRequest xmlns:foo="http://foo.com/" xmlns:sev="http://service.com/"> 
    <sev:header> 
     <foo:headerElement_1>var1</foo:headerElement_1> 
     <foo:headerElement_2>var2</foo:headerElement_2> 
     ... 
    </sev:header> 
    <sev:data> 
     <sev:requestData> 
      <sev:requestElement_1>var3</sev:requestElement_1> 
      <sev:requestElement_2>var4</sev:requestElement_2> 
      ... 
     </sev:requestData> 
    </sev:data> 
</sev:serviceRequest> 

Ich möchte unsere XSDs ändern, damit sie Nachrichten unterstützen die wie folgt aussieht :

<sev:serviceRequest xmlns:foo="http://foo.com/" xmlns:sev="http://service.com/"> 
    <sev:header> 
     <foo:headerElement_1>var1</foo:headerElement_1> 
     <foo:headerElement_2>var2</foo:headerElement_2> 
     ... 
    </sev:header> 
    <sev:data> 
     <requestData> 
      <requestElement_1>var3</requestElement_1> 
      <requestElement_2>var4</requestElement_2> 
      ... 
     </requestData> 
    </sev:data> 
</sev:serviceRequest> 

So werden keine Namespaces unter dem Datenelement angezeigt.

Ich habe versucht, die TNS: Deklaration auf dem RequestData-Element in service.xsd zu entfernen, aber es ist erforderlich.

Ich habe versucht, die elementFormDefault = "qualifizierte" Deklaration in allen XSDs zu entfernen, aber es hat nicht geholfen.

Ich habe versucht, die targetNamespace = "http://service.com/" -Debleration in service.xsd zu entfernen, aber dann muss das ServiceRequest-Element keinen Namespace haben.

Ist es überhaupt möglich?

service.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="http://service.com/" xmlns:foo=""http://foo.com/" xmlns:ibmSchExtn="http://www.ibm.com/schema/extensions" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://service.com/" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"> 
    <xsd:include schemaLocation="ServiceData.xsd"/> 
     <xsd:import namespace=""http://foo.com/" schemaLocation="Header.xsd"/> 
      <xsd:element ibmSchExtn:docRoot="true" name="serviceRequest" type="tns:ServiceRequestType"/> 
      <xsd:element ibmSchExtn:docRoot="true" name="serviceResponse" type="tns:ServiceResponseType"/> 

      <xsd:complexType name="ServiceRequestType"> 
       <xsd:sequence> 
        <xsd:element name="header" type="foo:Header"/> 
        <xsd:element maxOccurs="1" minOccurs="0" name="data"> 
         <xsd:complexType> 
          <xsd:sequence maxOccurs="1" minOccurs="1"> 
           <xsd:element name="requestData" type="tns:requestDataType"/> 
          </xsd:sequence> 
         </xsd:complexType> 
        </xsd:element> 
       </xsd:sequence> 
      </xsd:complexType> 
      ... 

header.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://foo.com/" xmlns:foo="http://foo.com/"> 
    <xsd:complexType name="Header"> 
     <xsd:sequence> 
      <xsd:element name="headerElement_1"> 
        <xsd:complexType> 
         <xsd:simpleContent> 
          <xsd:extension base="xsd:string"> 
            <xsd:attribute name="version" type="xsd:string"/> 
          </xsd:extension> 
         </xsd:simpleContent> 
        </xsd:complexType> 
      </xsd:element> 
      ... 

ServiceData.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="http://service.com/" version="1.0" xmlns:tns="http://service.com/"> 
    <xsd:complexType name="requestDataType"> 
     <xsd:sequence> 
      <xsd:element maxOccurs="1" minOccurs="1" name="requestElement_1"> 
       <xsd:simpleType> 
        <xsd:restriction base="xsd:string"> 
        <xsd:maxLength value="500"/> 
       ... 

Antwort

1

Um Elemente (request, requestElement_1) in keinem Namensraum zu definieren, Sie müssen für sie ein Schema ohne Zielnamespace definieren. Es ist ähnlich wie das Original serviceData.xsd, aber das Element request muss es muss so gut und die target bewegt werden Attribut entfernt werden:

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      attributeFormDefault="qualified" 
      elementFormDefault="qualified" 
      version="1.0"> 
    <xsd:element name="requestData" type="requestDataType"/> 
    <xsd:complexType name="requestDataType"> 
     <xsd:sequence> 
      <xsd:element maxOccurs="1" minOccurs="1" name="requestElement_1"> 
       <xsd:simpleType> 
        <xsd:restriction base="xsd:string"> 
         <xsd:maxLength value="500"/> 
        </xsd:restriction> 
       </xsd:simpleType> 
      </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

Dann können Sie dieses Schema in service.xsd importieren müssen, nicht enthalten , die unterschiedliche Semantik hat. Include würde stattdessen den Namespace aller Elemente in den von service.xsd ändern.

<?xml version="1.0" encoding="UTF-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
      elementFormDefault="qualified" 
      targetNamespace="http://service.com/" 
      xmlns:foo="http://foo.com/" 
      xmlns:tns="http://service.com/" 
      xmlns:ibmSchExtn="http://www.ibm.com/schema/extensions"> 
    <xsd:import schemaLocation="ServiceData.xsd"/> 
    <xsd:import namespace="http://foo.com/" schemaLocation="header.xsd"/> 
    <xsd:element ibmSchExtn:docRoot="true" name="serviceRequest" type="tns:ServiceRequestType"/> 

    <xsd:complexType name="ServiceRequestType"> 
     <xsd:sequence> 
      <xsd:element name="header" type="foo:Header"/> 
      <xsd:element maxOccurs="1" minOccurs="0" name="data"> 
       <xsd:complexType> 
        <xsd:sequence maxOccurs="1" minOccurs="1"> 
         <xsd:element ref="requestData"/> 
        </xsd:sequence> 
       </xsd:complexType> 
      </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
</xsd:schema> 

Mit diesen Änderungen (und ein paar Kurskorrekturen in header.xsd), das folgende Dokument erfolgreich validiert:

<?xml version="1.0" encoding="UTF-8"?> 
<sev:serviceRequest 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://service.com/ service.xsd" 
    xmlns:sev="http://service.com/" 
    xmlns:foo="http://foo.com/"> 
    <sev:header> 
     <foo:headerElement_1>var1</foo:headerElement_1> 
    </sev:header> 
    <sev:data> 
     <requestData> 
      <requestElement_1>var3</requestElement_1> 
     </requestData> 
    </sev:data> 
</sev:serviceRequest> 
+0

"einige Zitat Fixes?" nur einer ... behoben. – Alaychem

0

Der Vollständigkeit halber hier ist eine alternative und einfachere Antwort, die auch funktioniert , obwohl es weniger eine strenge Namespace-Trennung für das Organisieren von Elementen tut (so hat es nicht meine persönliche Präferenz).

Sie können den beiden Elementen in Ihren ursprünglichen Schemas form = "unqualifiziert" hinzufügen. Dies ist eine Überschreibung für elementFormDefault = "qualifiziert" für nur diese beiden.

<xsd:element name="requestData" type="tns:requestDataType" form="unqualified"/> 
<xsd:element maxOccurs="1" minOccurs="1" name="requestElement_1" form="unqualified"> 
Verwandte Themen