我正在嘗試創建一個XML模式,其中很多類型都共享一些「幻數」。在XML Schema中使用實體「常量」
如果/當這些幻數發生變化時,我不想在幾個位置更改我的模式,我想將它們拖入某種常量定義中。
我曾經在添加一個DTD到我的模式並在這裏聲明一些實體。但我絕不是DTD方面的專家,雖然它看起來可以在使用該模式的C#應用程序中工作,但也有一個本機Win32應用程序,它使用與msxml 4.0相同的模式,在這種情況下這會爆炸...
有沒有人有這種擴展架構定義的經驗(可以這樣做),還是有更好的方法?
(編輯:一個例子)
例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>
實施例的Delphi的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編輯器中的intellisense變得模糊......贏了一些,輸了一些,我猜... –