2

たとえば、2 つの Xml スキーマがあります。

a.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="test" targetNamespace="test">
    <xsd:include schemaLocation="b.xsd" />
</xsd:schema>`

b.xsd:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <xsd:simpleType name="testType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="test"/>
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:element name="test" type="testType"/>
</xsd:schema>

2 番目のスキーマにはtargetNamespaceがなく、カメレオン スキーマとして使用されます。

XmlSchemaSet を使用してこれらのスキーマをプリロードしようとしています。

XmlSchemaSet schemaSet = new XmlSchemaSet();
schemaSet.Add(null, @"a.xsd");

foreach (XmlSchema schema in schemaSet.Schemas())  // foreach is used to simplify the example
{
    Console.WriteLine("Target namespace: "schema.TargetNamespace);  // "Target namespace: test"
    XmlSchemaInclude include = (XmlSchemaInclude)schema.Includes[0];
    Console.WriteLine("Include target namespace: " + include.Schema.TargetNamespace); // "Include target namespace: test"
}

しかし、私がそれを行った後、両方のスキーマに「テスト」ターゲット名前空間があります。インスタンス化されたスキーマ オブジェクトはソース スキーマと等しいはずですが、スキーマ "b.xsd" には当てはまりません。なぜそのように動作し、そのような動作を無効にする方法はありますか?

4

1 に答える 1

2

a.xsdからb.xsdを含めると、事実上、b.xsdにa.xsdと同じターゲット名前空間を持たせたいと言っていることになります。カメレオンインクルードという用語は、(b.xsdのように)ターゲット名前空間の仕様がないスキーマドキュメントが与えられた場合に、それを実現するプロセスを示します。

b.xsdで宣言されたtest要素と型を名前空間に含めたくない場合は、b.xsdをカメレオンとして使用したくないので、a.xsdからb.xsdを含めないでください。代わりにxs:importを使用することをお勧めします。testTypetest

しかし、おそらく私はあなたが何を求めているのか理解していません。

于 2013-02-12T19:11:52.223 に答える