2

XML と XSD を使用して名前空間を正しく定義する方法を知りたいです。次の XML ファイルがあります。

<?xml version="1.0" encoding="utf-8" standalone="no"?>
<application
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:app="ms.xsd"
    xsi:schemaLocation="ms.xsd">
    <app:contactPerson>
        <app:name>Florian</app:name>
        <app:countryCode>FR</app:countryCode>
    </app:contactPerson>
    <app:contactPerson>
        <app:name>Gabi</app:name>
        <app:countryCode>DE,EE,EL,FI,FR,IE,UK</app:countryCode>
    </app:contactPerson>
    <app:contactPerson>
        <app:name>Gert</app:name>
        <app:countryCode>GB</app:countryCode>
    </app:contactPerson>
    <app:origin/>
</application>

また、スキーマは、同じフォルダー内のファイルms.xsdによって定義されます。

<?xml version="1.0" encoding="utf-8"?>
<xs:schema
    xmlns:xs="http://www.w3.org/2001/XMLSchema"
    elementFormDefault="qualified"
    attributeFormDefault="unqualified"
    version="0.2"
    targetNamespace="ms.xsd"
    xmlns:app="ms.xsd">
    <xs:element name="application" type="app:applicationType"/>
    <xs:complexType name="applicationType">
        <xs:sequence>
            <xs:element name="contactPerson" type="app:contactPersonType" minOccurs="0" maxOccurs="unbounded"/>
            <xs:element name="origin" type="app:originType" minOccurs="0"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="contactPersonType">
        <xs:sequence>
            <xs:element name="name" type="xs:string"/>
            <xs:element name="countryCode" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
    <xs:complexType name="originType">
        <xs:sequence minOccurs="0">
            <xs:element name="street" type="xs:string"/>
            <xs:element name="city" type="xs:string"/>
            <xs:element name="country" type="xs:string"/>
            <xs:element name="further_details" type="xs:string"/>
        </xs:sequence>
    </xs:complexType>
</xs:schema>

私はすでに多くのことを試しました。この(現在の)最終バージョンで発生するエラーは

エラー: 要素 'application': 検証ルートに使用できる一致するグローバル宣言がありません。

これは、xml-file の xsd-reference が application-tag 内にあり、「遅すぎる」ためですか? すべてに「封筒」タグを追加し、そこに xsd-definition を配置すると、メッセージが表示されます

エラー: 要素 'envelope': 検証ルートに使用できる一致するグローバル宣言がありません。

だから今、私はこれを正しく行う方法について本当に混乱しています。Notepadd++ の XML ツールを使用して、XSD に対して XML を検証しています。

4

2 に答える 2

4

app:application を試してください ... これでうまくいくはずです。宣言はその後であっても構いません。

于 2013-01-22T07:24:18.977 に答える
1

もう 1 つの方法は、デフォルトの名前空間を追加することです。

xmlns="ms.xsd"

これにより、<application>がその名前空間に配置されます。実際には、必要に応じて他のすべてのapp:プレフィックスを省略できます。@ jmcollin92のソリューションの方が優れていると思いますが、ギャップを埋めるだけです。

ところで:あなたのxsi:schemaLocationはずです:

xsi:schemaLocation="ms.xsd ms.xsd"

1 つ目ms.xsdは名前空間 (任意の文字列) です。2 番目ms.xsdは、スキーマを見つけることができるファイル (URI - 通常はファイルまたは URL) です。実際には、そのようなペアのリストにすることができます。厳密に言えば、xml ツールはエラーのフラグを立てる必要があります。

于 2013-01-22T11:30:12.107 に答える