Почему этот XML действителен для этого XSD? - PullRequest
2 голосов
/ 06 мая 2020

Я новичок в XML и сейчас работаю над синтаксическим анализом файла XML. При проверке файла XML мы получаем сообщение об ошибке:

Обнаружено недопустимое содержимое, начиная с элемента 'nxce: element'. На этом этапе дочерний элемент не ожидается.

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

XML Файл

<?xml version="1.0" encoding="UTF-8"?>
<employee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="file:///EmployeeSchema.xsd">
<emp>
    <empid>3</empid>
    <name>Name</name>
    <address>
        <building>Building</building>
        <pincode>Pincode</pincode>
        <street>Street</street>
        <area>Area</area>
    </address>
</emp>
</employee>

XSD-файл

<?xml version="1.0" encoding="UTF-8" ?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="employee">
<xs:complexType>
    <xs:sequence>
        <xs:element name="emp">
            <xs:complexType>
                <xs:sequence>
                    <xs:element name="empid" type="xs:string"/>
                    <xs:element name="name" type="xs:string"/>
                    <xs:element name="address">
                        <xs:complexType>
                            <xs:choice>
                                <xs:sequence>
                                    <xs:element name="street" type="xs:string" />
                                    <xs:element name="area" type="xs:string" />
                                </xs:sequence>
                                <xs:sequence>
                                    <xs:element name="building" type="xs:string" />
                                    <xs:element name="pincode" type="xs:string" />
                                </xs:sequence>
                            </xs:choice>    
                        </xs:complexType>
                    </xs:element>
                </xs:sequence>      
        </xs:complexType>   
    </xs:element>
</xs:sequence>  
</xs:complexType>
</xs:element>
</xs:schema>

Поскольку индикатор choice указывает, что может произойти либо один дочерний элемент, либо другой, я ожидал чтобы получить ошибку, как в теге address, я использовал все 4 элемента. Но XML был подтвержден без ошибок в eclipse. Не могли бы вы сообщить мне, почему я не получаю ошибку при проверке XML?

1 Ответ

2 голосов
/ 06 мая 2020

Ваше ожидание, что ваш XML должен быть недействительным по отношению к вашему XSD, верно.

Ваш XML, вероятно, даже не проверяется на ваш предполагаемый XSD, потому что ваш XML указывает

xsi:schemaLocation="file:///EmployeeSchema.xsd"

, где следует указать:

xsi:noNamespaceSchemaLocation="file:///EmployeeSchema.xsd"

Обратите внимание, что xsi:schemaLocation принимает URL-адреса пространства имен пары , а не только URL-адрес XSD, чтобы Найдите XSD для каждого пространства имен. Поскольку ваш XML не использует пространства имен, используйте xsi:noNamespaceSchemaLocation, как показано выше, а не xsi:schemaLocation.

См. Также

...