Вопрос:
У меня есть некоторая проблема, проверяющая xml на схему, которую я определил. Странно то, что проверка не удалась, только если я использую пространство имен по умолчанию xmlns=»http://retis.sssup.it/duck-lab», пока оно работает как шарм, если я определяю его как xmlns:dl=»http://retis.sssup.it/duck-lab».
Когда я использую пустое пространство имен, проверка не выполняется только по атрибутам со следующими сообщениями:
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’.
VALID 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>
Очевидно, я могу обойти проблему, определяющую непустое пространство имен, но я хотел бы понять, что неправильно.
Большое спасибо.
Лучший ответ:
Обработка пространства имен по умолчанию отличается для атрибутов – атрибут без префикса пространства имен НЕ связан с пространством имен по умолчанию, он не имеет пространства имен, см. здесь.
Это означает, что в недействительном XML различные атрибуты data-len, data-name и т.д. не имеют пространства имен, тогда как схема объявляет их в пространстве имен из-за директивы form=»qualified».