多くのタイプがいくつかの「マジックナンバー」を共有しているXMLスキーマを作成しようとしています。XMLスキーマでエンティティ '定数'を使用する
これらのマジックナンバーが変更された場合に、いくつかの場所でスキーマを変更するのではなく、何らかの定数定義に変更したいと思います。
私は、スキーマにDTDを追加し、ここにいくつかのエンティティを宣言して遊んでいます。しかし、私は決してDTDの専門家ではなく、スキーマを使用するC#アプリケーションで動作するようですが、msxml 4.0で同じスキーマを使用するネイティブWin32アプリケーションもあります。
この方法でスキーマ定義を拡張した経験がある人はいますか(それはできますか)、より良い方法がありますか?
(EDIT:例)
例XML:スキーマをロードする
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE schema [
<!ENTITY SomeMagicNumber "10">]>
<xs:schema targetNamespace="http://tempuri.org/XMLSchema.xsd"
elementFormDefault="qualified"
xmlns:mstns="http://tempuri.org/XMLSchema.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:simpleType name="MySimpleType">
<xs:restriction base="xs:int">
<xs:maxInclusive value="&SomeMagicNumber;" />
</xs:restriction>
</xs:simpleType>
<xs:complexType name="MyIntegers">
<xs:sequence>
<xs:element name="value" type="xs:int" maxOccurs="&SomeMagicNumber;" />
</xs:sequence>
</xs:complexType>
<xs:complexType name="MyFloats">
<xs:sequence>
<xs:element name="value" type="xs:float" maxOccurs="&SomeMagicNumber;" />
</xs:sequence>
</xs:complexType>
</xs:schema>
例デルファイのWin32コード:
var
XmlSchemas: IXMLDOMSchemaCollection;
XmlSchema: IXMLDOMDocument2;
XmlDocument: IXMLDOMDocument2;
begin
XmlSchemas := CoXMLSchemaCache40.Create;
XmlSchema := CoDOMDocument40.Create;
XmlSchema.load((*INSERT SCHEMA PATH HERE*));
Assert(XmlSchema.parseError.errorCode = 0, XmlSchema.parseError.reason);
XmlSchemas.add((*INSERT SCHEMA TARGET NAMESPACE HERE*), XmlSchema);
XmlDocument := CoDOMDocument40.Create;
XmlDocument.schemas := XmlSchemas;
XmlDocument.validateOnParse := True;
end;
コードスキーマをロードしようとした後にアサートします。理由: '一番上の要素の名前は、DOCTYPE宣言の名前と一致する必要があります。'
これはうまくいくようです。 残念ながら、これはVisual Studio XMLエディタでインテリセンスを微調整するようにも見えます。いくつか勝ち、いくぶん失います。 –