2016-06-14 160 views
1

在我們的組織,我們通常使用XML消息看起來像:(所用的XSD如下所示)如何在命名空間元素中定義非命名空間元素?

<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> 

我想改變我們的XSD,使他們支持,看起來像郵件:

<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> 

因此,數據元素下面不會出現名稱空間。

我試着刪除service.xsd中的requestData元素上的tns:decleration,但它是必需的。

我試圖刪除所有XSD中的elementFormDefault =「qualified」聲明,但它沒有幫助。

我試着刪除service.xsd中的targetNamespace =「http://service.com/」decleration,但是ServiceRequest元素不能有命名空間。

這有可能嗎?

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"/> 
       ... 

回答

1

爲了定義在沒有命名空間的元素(的RequestData,requestElement_1) ,你需要爲它們定義一個模式,沒有目標命名空間。它類似於原來的serviceData.xsd,但該元素具有的RequestData必須有移動以及和targetNamespace屬性必須被移除:

<?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> 

然後,你需要輸入這個模式到service.xsd,不包括,它有不同的語義。 Include會將所有元素的名稱空間改爲service.xsd的名稱空間。

<?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> 

隨着這些變化(在header.xsd少數報價修復),以下文件是成功驗證:

<?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

「很少有報價修復?」只有一個...固定。 – Alaychem

0

爲了完整起見,這裏是工程,以及備用和答案更簡單,儘管它對於組織元素的確很少有嚴格的命名空間分離(所以它沒有我的個人偏好)。

您可以將form =「unqualified」添加到原始模式中涉及的兩個元素。對於這兩個元素,這是對elementFormDefault =「qualified」的重寫。

<xsd:element name="requestData" type="tns:requestDataType" form="unqualified"/> 
<xsd:element maxOccurs="1" minOccurs="1" name="requestElement_1" form="unqualified"> 
相關問題