2012-05-25 3 views
2

У меня есть некоторая проблема с проверкой xml для схемы, которую я определил. Странно то, что проверка не удалась, только если я использую пространство имен по умолчанию xmlns="http://retis.sssup.it/duck-lab", пока оно работает как шарм, если я определяю его как xmlns:dl="http://retis.sssup.it/duck-lab".Ошибка проверки XML на атрибутах

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

cvc-complex-type.3.2.2: Attribute 'data_len' is not allowed to appear in element 'data'.  
cvc-complex-type.4: Attribute 'data_len' must appear on element 'data'. 

ДЕЙСТВИТЕЛЬНО XML:

<dl:duck xmlns:dl="http://retis.sssup.it/duck-lab" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://retis.sssup.it/duck-lab ../duck.xsd "> 
... 
     <dl:data dl:data_len="1" dl:data_name="name uint" dl:data_type="uint16" dl:endianess="big-endian"/> 

INVALID XML:

<duck xmlns="http://retis.sssup.it/duck-lab" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://retis.sssup.it/duck-lab ../duck.xsd "> 
... 
    <data data_len="1" data_name="name uint" data_type="uint16" endianess="big-endian"/> 

--EDIT--

DUCK.XSD

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://retis.sssup.it/duck-lab" 
    xmlns:dl="http://retis.sssup.it/duck-lab" elementFormDefault="qualified"> 

    <include schemaLocation="datatypes.xsd"/> 
    <include schemaLocation="duck_message.xsd"/> 

    <complexType name="DuckDefinitionType" block="#all" final="#all"> 
     <sequence> 
      <element type="dl:MessageType" name="message_description" form="qualified"/> 
     </sequence> 
    </complexType> 

    <element name="duck" type="dl:DuckDefinitionType" /> 

</schema> 

DATATYPES.XSD

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://retis.sssup.it/duck-lab" 
    xmlns:dl="http://retis.sssup.it/duck-lab" elementFormDefault="qualified"> 
     <attribute name="data_name" type="string"/> 
    <attribute name="data_len" type="nonNegativeInteger"/> 
    <attribute name="data_type" type="string"/> 
    <attribute name="endianess" type="string"/> 
     <element name="data"> 
     <complexType> 
      <attribute ref="dl:data_name" use="required"/> 
      <attribute ref="dl:data_len" use="required"/> 
      <attribute ref="dl:data_type" use="required"/> 
      <attribute ref="dl:endianess" use="required"/> 
     </complexType> 
    </element> 
</schema> 

DUCK_MESSAGE.XSD

<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://retis.sssup.it/duck-lab" 
    xmlns:dl="http://retis.sssup.it/duck-lab" elementFormDefault="qualified"> 

    <include schemaLocation="datatypes.xsd"></include> 
    <complexType name="MessageType"> 
     <sequence maxOccurs="unbounded"> 
      <element ref="dl:data"></element> 
     </sequence> 
    </complexType> 
</schema> 

Очевидно, что я могу обойти проблему определения непустых имен, но я хотел бы понять, что случилось.

Большое спасибо.

+0

Покажите нам остальную часть схемы (особенно элемент 'schema', поскольку это потенциально похоже на проблему с квалифицированными атрибутами. –

+0

Обновлен вопрос с остальной частью схемы. – hara

ответ

2

Управление пространством имен по умолчанию отличается от атрибутов - атрибут без префикса пространства имен НЕ связан с пространством имен по умолчанию, он не имеет пространства имен, см. here.

Это означает, что в недействительных XML различные атрибуты data-len, data-name и т.д. не имеют имен, в то время как схема объявляет их быть в http://retis.sssup.it/duck-lab имен из-за form="qualified" директивы.

Смежные вопросы