1

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>

XML のルート要素からプレフィックスを削除するmx:と、問題なく検証されます。私は名前空間で迷っており、インターネットを数時間検索しています。mx:XML を変更できないため、プレフィックスを許可するように XSD を調整する必要があります。バリデーターは次のエラーを返します。

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

1 に答える 1

2

あなたの質問は、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>

targetNamespaceXSD で属性が定義されていません。したがって、XMLimportは、インスタンス ドキュメントで名前空間なしで表示する必要があります。これが、XML ドキュメントのXMLimportから名前空間を削除すると有効になる理由です。

追加targetNamespace="http://www.w3.org/2001/XMLSchema"すると、XML を検証する XSD が作成されます。一般に、targetNamespace の値は、ドキュメント要素の名前空間と一致する必要があります (カメレオン XSD は特殊なケースです)。

ここでのもう 1 つの問題はelementFormDefault、デフォルトでどちらが であるかということですunqualified。この設定は、名前空間なしで内部要素Leverancierを作成するものです。Bestandsversie

もう 1 つの注目すべき点は、名前空間を対象とするユーザー定義のコンテンツを目にすることは非常に珍しいことですがhttp://www.w3.org/2001/XMLSchema、XSD 1.0 仕様には、ユーザーがこの名前空間を対象とすることを明示的に禁止する規定がないことです。これは、サンプル XML で見られる他の名前空間とは異なりますhttp://www.w3.org/2001/XMLSchema-instance。ユーザー定義の XSD でこの名前空間を対象にすることは明示的に禁止されています。

この SO 投稿も役立つかもしれません。

于 2013-02-10T18:28:58.710 に答える