2016-06-14 8 views
1

В нашей организации, мы обычно используем XML-сообщения, выглядит следующим образом: (. В XSDs используемые показаны ниже)Как определить элементы с именами без имени в элементах с именами?

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

Я хочу, чтобы изменить наши XSDs так, что они будут поддерживать сообщения, которые выглядят как :

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

Таким образом, под элементом данных не появятся пространства имен.

Я попытался удалить tns: decliation на элементе requestData в service.xsd, но это необходимо.

Я попытался удалить elementFormDefault = "квалифицированное" объявление во всех XSD, но это не помогло.

Я попытался удалить объявление targetNamespace = "http://service.com/" в service.xsd, но тогда элемент 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 должен быть перемещен туда же и атрибут должен быть целевым пространство удалено:

<?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 = «квалифицировано» только для этих двух.

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