Я пытаюсь создать схему XML, в которой многие типы совместно используют некоторые «магические числа».
Вместо того, чтобы менять схему в нескольких местах, если / когда эти магические числа изменяются, яхотел бы вытащить их в какое-то постоянное определение.
Я поиграл с добавлением 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.»