XML не проверяется на соответствие определенному XSD

XML (упрощенный):

<?xml version="1.0" encoding="UTF-8"?>
<mx:XMLimport xmlns:mx="http://www.w3.org/2001/XMLSchema" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <Leverancier>nn</Leverancier>
    <Bestandsversie>1.1.0.0</Bestandsversie>
</mx:XMLimport>

XSD:

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
            elementFormDefault="qualified">
    <xsd:element name="XMLimport">
        <xsd:complexType>
            <xsd:sequence>
              <xsd:element name="Leverancier" type="xsd:string" minOccurs="1"/>
              <xsd:element name="Bestandsversie" type="xsd:string" minOccurs="1"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>
</xsd:schema>

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

ERROR: Element '{http://www.w3.org/2001/XMLSchema}XMLimport':
       No matching global declaration available for the validation root.

1 ответ

Я предполагаю, что ваш вопрос заключается в том, как XSD должен выглядеть в соответствии с вашим XML. Это исправленный XSD:

<?xml version="1.0" encoding="utf-8" ?>
<!-- XML Schema generated by QTAssistant/XSD Module (http://www.paschidev.com) -->
<xsd:schema targetNamespace="http://www.w3.org/2001/XMLSchema" xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:element name="XMLimport">
        <xsd:complexType>
            <xsd:sequence>
                <xsd:element name="Leverancier" type="xsd:string"/>
                <xsd:element name="Bestandsversie" type="xsd:string"/>
            </xsd:sequence>
        </xsd:complexType>
    </xsd:element>  
</xsd:schema>

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

Если вы добавите targetNamespace="http://www.w3.org/2001/XMLSchema" теперь у вас будет XSD, который проверит ваш XML; в общем случае значение targetNamespace должно соответствовать пространству имен вашего элемента документа (XSD-хамелеоны - это особый случай).

Другая вещь в игре здесь elementFormDefault который по умолчанию unqualified, Этот параметр является тем, что делает внутренние элементы Leverancier а также Bestandsversie без пространства имен.

Следует также отметить, что, хотя пользовательский контент, ориентированный на http://www.w3.org/2001/XMLSchema пространство имен, в спецификации XSD 1.0 нет положения, которое бы явно запрещало пользователям ориентироваться на это пространство имен. Это не похоже на другое пространство имен, которое вы видите в своем примере XML, http://www.w3.org/2001/XMLSchema-instance: явно запрещено указывать это пространство имен в определенных пользователем XSD.

Этот пост тоже может помочь.

Другие вопросы по тегам