4

schema.xsd外部 file にカスタム型を持つ XML スキーマがありますtypes.xsdtypeComplex複合型が正しく検証されない理由がわかりません。動作のような単純なタイプは問題ありtypeSimpleません。それの何が問題なのですか?

エクリプス 言う:

cvc-complex-type.2.4.a: 要素「a」で始まる無効なコンテンツが見つかりました。「{"http://www.example.org/types":a}」のいずれかが必要です。

スキーマ.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/schema" elementFormDefault="qualified"
    xmlns:t="http://www.example.org/types">

    <xs:import schemaLocation="types.xsd" namespace="http://www.example.org/types" />

    <xs:element name="root">
        <xs:complexType>
            <xs:all>
                <xs:element name="simple" type="t:typeSimple" />
                <xs:element name="complex" type="t:typeComplex" />
            </xs:all>
        </xs:complexType>
    </xs:element>

</xs:schema>

タイプ.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/types" xmlns="http://www.example.org/types"
    elementFormDefault="qualified">

    <xs:simpleType name="typeSimple">
        <xs:restriction base="xs:string">
            <xs:length value="3" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="typeComplex">
        <xs:sequence>
            <xs:element name="a" type="xs:string" />
            <xs:element name="b" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

text.xml - xsd では無効 - なぜ?

<?xml version="1.0" encoding="UTF-8"?>
<root xmlns="http://www.example.org/schema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.example.org/schema schema.xsd " xmlns:t="http://www.example.org/types">
    <simple>XXX</simple>
    <complex>
        <a></a> <!-- not valid here; Eclipse say: cvc-complex-type.2.4.a: Invalid content was found starting with element 'a'. One of '{"http://www.example.org/types":a}' is expected. -->
        <b></b>
    </complex>
</root>
4

2 に答える 2

1

インスタンス ドキュメントは、名前空間「http://www.example.org/schema」内の「ルート」タイプのインスタンスとして宣言されています。これで問題ありません。このドキュメント内では、名前空間「http://www.example.org/types」のタイプを使用する必要があるため、この名前空間に接頭辞を付けました。これでもいいです。

ただし、「http://www.example.org/types」名前空間に含まれるタイプを使用すると、xmlns 宣言で定義したプレフィックスが無視されます。

これらの型を参照する正しい方法:

<root xmlns="http://www.example.org/schema" 
      xmlns:t="http://www.example.org/types">
  <simple>XXX</simple>
  <complex>
    <t:a></t:a>
    <t:b></t:b>
  </complex>
</root>

アップデート

あなたの選択肢は次のとおりです。

修飾されていない型を使用します。スキーマ定義を make に変更するだけelementFormDefault="unqualified"です。これは、次のことができるようになったことを意味します。

<root xmlns="http://www.example.org/schema">
  <simple xmlns="">XXX</simple>
  <complex xmlns="">
    <a></a>
    <b></b>
  </complex>
</root>

または、XSD スキーマを使用しないでください。これは、整形式の xml をそのまま使用できることを意味します。

<root>
  <simple>XXX</simple>
  <complex>
    <a></a>
    <b></b>
  </complex>
</root>
于 2012-04-26T08:46:07.193 に答える
1

使いたかったです<xs:include />

スキーマ.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
    targetNamespace="http://www.example.org/schema" elementFormDefault="qualified">

    <xs:include schemaLocation="types.xsd" />

    <xs:element name="root">
        <xs:complexType>
            <xs:all>
                <xs:element name="simple" type="typeSimple" />
                <xs:element name="complex" type="typeComplex" />
            </xs:all>
        </xs:complexType>
    </xs:element>

</xs:schema>

タイプ.xsd:

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">

    <xs:simpleType name="typeSimple">
        <xs:restriction base="xs:string">
            <xs:length value="3" />
        </xs:restriction>
    </xs:simpleType>

    <xs:complexType name="typeComplex">
        <xs:sequence>
            <xs:element name="a" type="xs:string" />
            <xs:element name="b" type="xs:string" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>
于 2012-05-12T05:29:52.570 に答える