12

XSD を次のように指定します。

<xs:schema elementFormDefault="qualified" attributeFormDefault="unqualified" xmlns:xs="http://www.w3.org/2001/XMLSchema"  xmlns:std="http://..." targetNamespace="...">
  <xs:element name="SomeRootNode" type="std:SomeRootNodeType" />
  ...
</xs:schema>

これは、異なる名前空間からの子を許可するいくつかの要素を定義します。

このスキーマを独自のもので拡張し、子要素と特定の要素の属性をベース ドキュメントに挿入したいと考えています。たとえば、myElementX または myAttributeY には親ノード std:SomeRootNode が必要です。結合されたドキュメントは、基本スキーマで既に許可されている方法で、第三者が引き続きドキュメントを拡張できるようにする必要がありますが、名前空間の要素と属性については、すべての要素と属性が正しい親ノードを持っていることを検証したいベース ドキュメント内の許可された場所にのみ表示されます。

これはどのように達成できますか?

私が拡張している基本スキーマの再定義に頼らないクリーンな解決策があることを願っています。基本スキーマの新しいバージョンがリリースされた場合に、簡単に適応できるようにしたいと考えています。基本ドキュメントの新しいバージョンがリリースされるたびに、新しい再定義で変更する必要はありません (設計に重大な変更がない限り)。

4

1 に答える 1

20

既存の XML スキーマの拡張に関しては、いくつかのオプションがあります。

基本スキーマの使用

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:element name="Root" type="RootType" />
    <xs:complexType name="RootType">
        <xs:sequence>
            <xs:element name="OriginalContent" />
        </xs:sequence>
    </xs:complexType>
</xs:schema>

グラフィカルなスキーマ表現

延長・制限

タイプを拡張/制限できます。これにより、要素/属性が追加/削減された新しいタイプが効果的に作成されますが、この新しいタイプの使用を強制する方法はありません。XML の作成者は、xsi:type="MyCustomType" を使用して新しい型を使用していることを伝えることができますが、その使用を主張することはできません。

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:include schemaLocation=".\Root.xsd" />
    <xs:complexType name="MyNewRoot">
        <xs:complexContent>
            <xs:extension base="RootType">
                <xs:sequence>
                    <xs:element name="AdditionalElement" type="xs:string" />
                </xs:sequence>
            </xs:extension>
        </xs:complexContent>
    </xs:complexType>
</xs:schema>

グラフィカルなスキーマ表現

サンプル XML ファイル

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:noNamespaceSchemaLocation="Extension.xsd" 
      xsi:type="MyNewRoot">
    <OriginalContent />
    <AdditionalElement/>
</Root>

グラフィカルなスキーマ表現

再定義

もう 1 つの方法は、 を使用すること<redefine>です。基本的に RootType の定義を置き換えるため、RootType が表示される場合は常に新しいバージョンを使用する必要があります。

<?xml version="1.0" encoding="utf-8" ?>
<xs:schema elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
    <xs:redefine schemaLocation="root.xsd">
        <xs:complexType name="RootType">
            <xs:complexContent>
                <xs:extension base="RootType">
                    <xs:sequence>
                        <xs:element name="MyContent" type="xs:string" />
                    </xs:sequence>
                </xs:extension>
            </xs:complexContent>
        </xs:complexType>
    </xs:redefine>
</xs:schema>

サンプル XML ファイル

<?xml version="1.0" encoding="utf-8"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="Redefine.xsd">
    <OriginalContent></OriginalContent>
    <MyContent>stuff</MyContent>
</Root>

どれでも

もう 1 つの解決策はxs:any、基本要素の定義に a を含めることです。ただし、基本スキーマを制御しないと、これは不可能です。

オープンコンテンツ

** XSD 1.1 でのみ利用可能 **

オープン コンテンツは、オープン スキーマを作成できるようにするために特別に追加されたもので、2 つのモードのインターリーブとサフィックスがあります。追加要素をインターリーブするように設定すると (含まれる xs:any 節に一致する)、要素全体 (既存の要素の前、間、後) にインターリーブできます。接尾辞モードの場合、(含まれている xs:any 句に一致する) 追加の要素を既存の要素のに追加できます。

OpenContent は、特定の complexTypes に適用することも、スキーマ レベルで適用することもできます。スキーマ レベルでは、その中で宣言されているすべての要素に適用されます。

XSD 1.1 を使用している場合、これは間違いなくスキーマを拡張可能にするための方法ですが、XSD 1.1 はまだ十分にサポートされていません。

<xs:complexType name="BookType">
    <xs:openContent mode="interleave">
        <xs:any />
    </xs:openContent>
    <xs:sequence>
        <xs:element name="Title"  type="xs:string" />
        <xs:element name="Author" type="xs:string" maxOccurs="unbounded" />
        <xs:element name="ISBN"   type="xs:string" />
    </xs:sequence>
</xs:complexType>

グラフィカルなスキーマ表現

また、既存の要素 (つまり、Title、Author、NewElement、Author、ISBN) の間に要素をインターリーブする場合、ほとんどのパーサーは 2 番目の Author を「新しい」要素として扱い、openContent ルールを使用して検証しないことに注意してください。xs:element name="Author" type="xs:string" 、さらに AuthorのminOccurs が 2 の場合、1xAuthor、1xNewElement、1xAuthor、および最初の 1xAuthor が minoccurs 句を完全に満たしていないため、この句は失敗する可能性があります。 .

概要

これらすべての方法には一長一短がありますが、優れたXML エディターを使用すると、何が起こっているのかをはるかに簡単に把握できます。

私の会社が作ったLiquid XML Studio をお勧めします。優れたXSDエディターを備えており、スキーマからサンプルXMLを作成できるため、作業の結果を簡単に確認できます。また、XMLインテリセンスにより、有効なものを簡単に確認できます。オプション。

于 2010-08-06T11:05:27.520 に答える