XML-схема xs: выбор внутри XS: последовательность
Я пытаюсь использовать элемент xs:choice, но при проверке файла XSD я получаю ошибку, которая, как я полагаю, связана с элементом xs: choice. Я искал эту проблему довольно долго, нашел несколько похожих, но ни один не дал мне ответа, который я искал, чтобы решить мою проблему.
То, что я пытаюсь сделать, - это объявить элемент под названием "данные", чьи childs были бы меткой времени и датчиком или поставщиком (здесь я пытаюсь использовать элемент выбора, так как я требуется только элемент датчика или поставщика в качестве родственного элемента метки времени).
Следующий XML-это то, что я пытаюсь проверить:
<?xml version="1.0" encoding="ISO-8859-1"?>
<experience xmlns="http://www.w3schools.com"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<data>
<timestamp>123456789</timestamp>
<sensor origin="proximity" >
<x-axis>9</x-axis>
<y-axis>0</y-axis>
<z-axis>0</z-axis>
<w-axis>0</w-axis>
</sensor>
</data>
</experience>
И чтобы проверить этот XML, я написал следующий XSD-файл:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- definition of attributes -->
<xs:attribute name="origin" type="xs:string" />
<!-- definition of complex elements -->
<xs:element name="provider">
<xs:complexType>
<xs:all>
<xs:element name="latitude" type="xs:float" />
<xs:element name="longitude" type="xs:float" />
<xs:element name="altitude" type="xs:float" />
<xs:element name="bearing" type="xs:float" />
<xs:element name="speed" type="xs:float" />
</xs:all>
<xs:attribute ref="origin" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="sensor">
<xs:complexType>
<xs:all>
<xs:element name="x-axis" type="xs:float" />
<xs:element name="y-axis" type="xs:float" />
<xs:element name="z-axis" type="xs:float" />
<xs:element name="w-axis" type="xs:float" />
</xs:all>
<xs:attribute ref="origin" use="required"/>
</xs:complexType>
</xs:element>
<xs:element name="data">
<xs:complexType>
<xs:sequence>
<xs:element ref="timestamp" minOccurs="1" maxOccurs="1" />
<xs:choice>
<element ref="provider" />
<element ref="sensor" />
</xs:choice>
</xs:sequence>
</xs:complexType>
</xs:element>
<!-- definition of main type -->
<xs:element name="experience">
<xs:complexType>
<xs:sequence>
<xs:element ref="data" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
Но как только я загружаю файл и пытаюсь проверить его с помощью следующего веб-сайта w3 , я получаю следующую ошибку:
Файл:/usr / local/XSV/xsvlog/tmph7cMmLuploaded: 45: 6: недопустимый per вах-сложного-типа.1.2.4: элемент {None}: элемент не разрешен здесь (1) в элемент {http://www.w3.org/2001/XMLSchema }: выбор, ожидание [{http://www.w3.org/2001/XMLSchema}:annotation,$,{http://www.w3.org/2001/XMLSchema}:element,{http://www.w3.org/2001/XMLSchema}:group,{http://www.w3.org/2001/XMLSchema}:choice,{http://www.w3.org/2001/XMLSchema}:sequence,{http://www.w3.org/2001/XMLSchema}:any]:
Я думаю, что проблема заключается в элементе xs:choice, но я может, и ошибся.
Поскольку я впервые пытаюсь использовать элемент xs:choice, у меня есть некоторые сомнения, правильно ли я его использую. В соответствии с примером в w3schools я есть, но поскольку я намерен использовать его рядом с другим элементом, я не знаю, правильно ли это.
Если бы кто-нибудь мог помочь мне в этом, я был бы очень признателен.Заранее большое спасибо.
1 ответ:
В XML и XSD есть несколько движущихся целей; поэтому XSD и XML ниже минимально модифицированы, чтобы соответствовать друг другу...
Модифицированный XSD:
<?xml version="1.0" encoding="utf-8" ?> <!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3schools.com" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified"> <!-- definition of attributes --> <xs:attribute name="origin" type="xs:string"/> <!-- definition of complex elements --> <xs:element name="provider"> <xs:complexType> <xs:all> <xs:element name="latitude" type="xs:float"/> <xs:element name="longitude" type="xs:float"/> <xs:element name="altitude" type="xs:float"/> <xs:element name="bearing" type="xs:float"/> <xs:element name="speed" type="xs:float"/> </xs:all> <xs:attribute ref="origin" use="required"/> </xs:complexType> </xs:element> <xs:element name="sensor"> <xs:complexType> <xs:all> <xs:element name="x-axis" type="xs:float"/> <xs:element name="y-axis" type="xs:float"/> <xs:element name="z-axis" type="xs:float"/> <xs:element name="w-axis" type="xs:float"/> </xs:all> <xs:attribute ref="origin" use="required"/> </xs:complexType> </xs:element> <xs:element name="timestamp" type="xs:long"/> <xs:element name="data"> <xs:complexType> <xs:sequence> <xs:element ref="timestamp" minOccurs="1" maxOccurs="1"/> <xs:choice> <xs:element ref="provider"/> <xs:element ref="sensor"/> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> <!-- definition of main type --> <xs:element name="experience"> <xs:complexType> <xs:sequence> <xs:element ref="data" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
Модифицированный XML:
<?xml version="1.0" encoding="ISO-8859-1"?> <experience xmlns="http://www.w3schools.com" xmlns:tns="http://www.w3schools.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <data> <timestamp>123456789</timestamp> <sensor tns:origin="proximity"> <x-axis>9</x-axis> <y-axis>0</y-axis> <z-axis>0</z-axis> <w-axis>0</w-axis> </sensor> </data> </experience>
Итак, вот что происходит:
Ваш XML определяет пространство имен XML по умолчанию; поэтому ваш XSD должен определить соответствующее пространство имен, поэтому смотрите новый атрибут targetNamespace и добавление xmlns по умолчанию, чтобы соответствовать этому.
Так как все ваши элементы являются квалифицированными (из-за использования пространства имен по умолчанию на корневом уровне), то ваша схема должна использовать
elementFormDefault="qualified"
Ваша проблема с выбором заключается в том, что у вас есть
<element ref="provider"
и т. д. который нуждается в XS: квалификаторе (это суть ошибки, которую вы предоставили)Я добавил элемент
timestamp
в ваш XSD.Однако с этими изменениями проблема теперь становится вашим XML, особенно атрибутом origin. Поскольку вы объявили атрибут глобальным, он должен быть квалифицированным в пространстве имен XSD, поэтому я добавляю
xmln:tns=...
и fixintns:origin=...
Если вы действительно не хотите изменять XML, то ваш XSD должен либо определить атрибут локально (вместо ссылки), либо обернуть атрибут в группу и ссылаться на нее. Итак, вот обновленный XSD, который соответствует исходному XML.
<?xml version="1.0" encoding="utf-8" ?> <!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) --> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3schools.com" targetNamespace="http://www.w3schools.com" elementFormDefault="qualified"> <xs:attributeGroup name="origin"> <!-- definition of attributes --> <xs:attribute name="origin" type="xs:string"/> </xs:attributeGroup> <!-- definition of complex elements --> <xs:element name="provider"> <xs:complexType> <xs:all> <xs:element name="latitude" type="xs:float"/> <xs:element name="longitude" type="xs:float"/> <xs:element name="altitude" type="xs:float"/> <xs:element name="bearing" type="xs:float"/> <xs:element name="speed" type="xs:float"/> </xs:all> <xs:attributeGroup ref="origin"/> </xs:complexType> </xs:element> <xs:element name="sensor"> <xs:complexType> <xs:all> <xs:element name="x-axis" type="xs:float"/> <xs:element name="y-axis" type="xs:float"/> <xs:element name="z-axis" type="xs:float"/> <xs:element name="w-axis" type="xs:float"/> </xs:all> <xs:attributeGroup ref="origin"/> </xs:complexType> </xs:element> <xs:element name="timestamp" type="xs:long"/> <xs:element name="data"> <xs:complexType> <xs:sequence> <xs:element ref="timestamp" minOccurs="1" maxOccurs="1"/> <xs:choice> <xs:element ref="provider"/> <xs:element ref="sensor"/> </xs:choice> </xs:sequence> </xs:complexType> </xs:element> <!-- definition of main type --> <xs:element name="experience"> <xs:complexType> <xs:sequence> <xs:element ref="data" minOccurs="0" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>