既存の 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インテリセンスにより、有効なものを簡単に確認できます。オプション。