XSD-проверка для XML не удалась - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть XML-файл, содержимое которого указано ниже

<?xml version="1.0" encoding="UTF-8"?>
<SETTINGS Version="1">
<CLEANING amount="40"/>
<CLEANING name="abcd"/>
<CLEANING initials="ABCD"/>
<MAINTENANCE state="on"/>
<MAINTENANCE temperature="F"/>
</SETTINGS>

Я создал схему XSD для этого XML, используя какой-то инструмент, сгенерировавший приведенный ниже вывод XSD.

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="SETTINGS">
        <xs:complexType>
            <xs:sequence>
                <xs:element name="CLEANING" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:attribute name="amount" type="xs:unsignedByte" use="required" />
                        <xs:attribute name="name" type="xs:string" use="required" />
                        <xs:attribute name="initials" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
                <xs:element name="MAINTENANCE" maxOccurs="unbounded">
                    <xs:complexType>
                        <xs:attribute name="state" type="xs:string" use="required" />
                        <xs:attribute name="temperature" type="xs:string" use="required" />
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
            <xs:attribute name="Version" type="xs:unsignedByte" use="required" />
        </xs:complexType>
    </xs:element>
</xs:schema>

СейчасКогда я пытаюсь проверить этот XMl по сгенерированной схеме XSD, я получаю ниже ошибки в валидации (проверяется с помощью некоторого онлайн-валидатора).

Not valid.
Error - Line 3, 24: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 24; cvc-complex-type.4: Attribute 'name' must appear on element 'CLEANING'.
Error - Line 3, 24: org.xml.sax.SAXParseException; lineNumber: 3; columnNumber: 24; cvc-complex-type.4: Attribute 'initials' must appear on element 'CLEANING'.
Error - Line 4, 24: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 24; cvc-complex-type.4: Attribute 'amount' must appear on element 'CLEANING'.
Error - Line 4, 24: org.xml.sax.SAXParseException; lineNumber: 4; columnNumber: 24; cvc-complex-type.4: Attribute 'initials' must appear on element 'CLEANING'.
Error - Line 5, 28: org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 28; cvc-complex-type.4: Attribute 'amount' must appear on element 'CLEANING'.
Error - Line 5, 28: org.xml.sax.SAXParseException; lineNumber: 5; columnNumber: 28; cvc-complex-type.4: Attribute 'name' must appear on element 'CLEANING'.
Error - Line 6, 26: org.xml.sax.SAXParseException; lineNumber: 6; columnNumber: 26; cvc-complex-type.4: Attribute 'temperature' must appear on element 'MAINTENANCE'.
Error - Line 7, 31: org.xml.sax.SAXParseException; lineNumber: 7; columnNumber: 31; cvc-complex-type.4: Attribute 'state' must appear on element 'MAINTENANCE'.

И XML, и XSD являются допустимыми форматами, подтвержденными онлайн.Я не могу понять причину этой ошибки.Я подозреваю, что это из-за того, что несколько элементов имеют одно и то же имя, и я думаю, что есть некоторые ограничения в создании схемы XSD.Не знаете точно, что не так.

Что я здесь делаю не так и как можно решить эту ошибку?

1 Ответ

0 голосов
/ 18 декабря 2018
<xs:complexType>
  <xs:attribute name="amount" type="xs:unsignedByte" use="required" />
  <xs:attribute name="name" type="xs:string" use="required" />
  <xs:attribute name="initials" type="xs:string" use="required" />
</xs:complexType>

слово require означает, что атрибут необходим, поэтому основная запись вашего XML:

<CLEANING amount="40" name="abcd" initials="ABCD"/>

, если вы хотите, чтобы вы писали, вам нужноудалить require вашего XSD

то же самое для MAINTENANCE

ваш XSD проверит этот текст:

<SETTINGS Version="1">
    <CLEANING amount="40" name="abcd" initials="ABCD"/>
    <MAINTENANCE state="on" temperature="F"/>
</SETTINGS>

Но если выЕсли вы хотите проверить ваш XML с этим видом, вы не можете поставить use=require, поэтому у вас будет что-то вроде:

 ...
    <xs:complexType>
        <xs:attribute name="amount" type="xs:unsignedByte" />
        <xs:attribute name="name" type="xs:string" />
        <xs:attribute name="initials" type="xs:string" />
    </xs:complexType>
...

Более того, если вы хотите иметь свою форму (так: <a att1 ="" /> <a att2="" />)

вам нужно будет изменить свой атрибут следующим образом:

<SETTINGS Version="1">
    <A amount="40" />
    <B name="abcd" />
    <C initials="ABCD"/>
    <D state="on" />
    <E temperature="F"/>
</SETTINGS>

, но я думаю, что последняя возможность может быть излишней для первого варианта

...