Целевое пространство имен игнорируется в XSD

У меня есть схемы XML, предоставленные несколькими поставщиками. Они здесь:

OCISchemaBASE.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="C" targetNamespace="C">

  <xs:element name="BroadsoftDocument" type="OCIMessage"/>

  <xs:complexType name="OCIMessage">
    <xs:sequence>
      <xs:choice>
        <xs:element name="sessionId" type="xs:normalizedString"/>
        <xs:element name="userId" type="xs:token"/>
        <xs:element name="phoneNumber" type="xs:token"/>
      </xs:choice>
      <xs:element name="command" type="OCICommand" minOccurs="1" maxOccurs="15"/>
    </xs:sequence>
    <xs:attribute name="protocol" use="required">
      <xs:simpleType>
        <xs:restriction base="xs:NMTOKEN">
          <xs:enumeration value="OCI"/>
          <xs:enumeration value="NSOCI"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>

  <xs:complexType name="OCICommand" abstract="true">
    <xs:sequence>
    </xs:sequence>
    <xs:attribute name="echo" type="xs:string" use="optional"/>
  </xs:complexType>

  <xs:complexType name="OCIRequest" abstract="true">
    <xs:complexContent>
      <xs:extension base="OCICommand">
        <xs:sequence>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>

</xs:schema>

OCISchemaLogin.xsd

<xs:schema xmlns:xs             = "http://www.w3.org/2001/XMLSchema"
           xmlns:core           = "C"
           xmlns                = ""
           attributeFormDefault = "qualified"
           elementFormDefault   = "qualified">

  <xs:import namespace      = "C"
             schemaLocation = "OCISchemaBASE.xsd"/>

  <xs:complexType name="AuthenticationRequest">
    <xs:complexContent>
      <xs:extension base="core:OCIRequest">
        <xs:sequence>
          <xs:element name="userId" type="UserId"/>
        </xs:sequence>
      </xs:extension>
    </xs:complexContent>
  </xs:complexType>    

</xs:schema>

OCISchemaDataTypes.xsd

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:core="C" attributeFormDefault="qualified" elementFormDefault="qualified">

  <xs:simpleType name="UserId">
    <xs:restriction base="xs:token">
      <xs:minLength value="1"/>
      <xs:maxLength value="161"/>
    </xs:restriction>
  </xs:simpleType>

</xs:schema>

Вот мой XML-документ, который я создал в соответствии с этими схемами:

<?xml version="1.0" encoding="ISO-8859-1"?>
<BroadsoftDocument
    protocol="OCI" xmlns="C"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
>
    <sessionId xmlns="">1405499871130</sessionId>
    <command xsi:type="AuthenticationRequest" xmlns="">
        <userId>[email protected]</userId>
    </command>
</BroadsoftDocument>

Когда я пытаюсь проверить этот документ на соответствие схемам с помощью xmllint, возникает следующая ошибка проверки:

$ xmllint --noout --schema OCISchemaLogin.xsd --schema OCISchemaBASE.xsd --schema OCISchemaDataTypes.xsd ./AuthenticationRequest.xml
./AuthenticationRequest.xml:3: namespace warning : xmlns: URI C is not absolute
    protocol="OCI" xmlns="C"
                            ^
Element '{C}BroadsoftDocument': No matching global declaration available for the validation root.
./AuthenticationRequest.xml fails to validate

Почему элемент BroadsoftDocument не находится в пространстве имен C, несмотря на объявление целевого пространства имен в OCISchemaBASE.xsd?

Тот же вопрос касается элемента sessionId в типе OCIMessage.


person vect    schedule 17.07.2014    source источник


Ответы (1)


Вы должны сообщить процессору XML, где найти XSD для вашего XML.

Один из способов сделать это - добавить schemaLocation к корневому элементу BroadsoftDocument:

<BroadsoftDocument
    xsi:schemaLocation="C OCISchemaBASE.xsd"
    [...]

Также обратите внимание, что ваше предупреждающее сообщение,

./AuthenticationRequest.xml:3: namespace warning : xmlns: URI C is not absolute
    protocol="OCI" xmlns="C"

потому что ваше чрезмерно упрощенное пространство имен C интерпретируется как относительный URI, который был устарело:

The use of relative URI references, including same-document references,
in namespace declarations is deprecated.
person kjhughes    schedule 17.07.2014