Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用实体';常数';在XML模式中_Xml_Delphi_Xsd_Dtd_Msxml - Fatal编程技术网

使用实体';常数';在XML模式中

使用实体';常数';在XML模式中,xml,delphi,xsd,dtd,msxml,Xml,Delphi,Xsd,Dtd,Msxml,我试图创建一个XML模式,其中许多类型共享一些“神奇的数字” 如果/当这些神奇的数字改变时,我不必在几个位置改变我的模式,我想把它们拉到某种常量定义中 我一直在尝试向模式中添加DTD,并在这里声明一些实体。但我绝对不是DTD方面的专家,虽然它似乎在使用该模式的C#应用程序中工作,但也有一个原生Win32应用程序使用与msxml 4.0相同的模式,在这里它崩溃了 有没有人有这样扩展模式定义的经验(可以这样做),或者有更好的方法 (编辑:一个例子) XML示例: <?xml version="

我试图创建一个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>

代码在尝试加载架构后断言。原因:“最顶层元素的名称必须与DOCTYPE声明的名称匹配。”

您可以创建一个公共xsd,并从其他架构导入它。看

报表模式report.xsd使用在另一个模式和另一个目标命名空间中定义的简单类型xipo:SKU


W3C模式XSD是一个XML文档,因此允许并支持实体。当模式文件被读取和处理时,实体将被扩展以生成XML信息集

顺便说一下,XSD本身就是XML 文件,当然,所以有 没有什么可以阻止你使用 模式本身中的实体。 (这有点反常,需要 要使用DTD声明的架构 那些实体。)你就是不能使用 用于声明要使用的实体的XML架构 在其他文件中

实体是一种方便的方法,可以避免复制/粘贴并简化XML实例文件的维护


如果它在解析模式时在本机Win32应用程序中“爆炸”,听起来像是MSXML 4.0或本机Win32应用程序中的错误。

是的,您可以使用实体在XML模式文件中定义常量

代码在尝试 加载模式。理由:'的名字 最上面的元素必须与 DOCTYPE声明的名称。'


…(被剪掉)
您的问题是由DTD不知道名称空间这一事实引起的。因此,解析器会看到一个定义根元素
的DTD,而文档有一个根元素
。尝试使用


我已经发布了一个类似于我正在尝试做的事情的简短示例。上面的模式将以C#加载(前提是我允许在XmlReader中使用DTD)。所示的Delphi示例将失败,因为它似乎无法将DTD与根元素匹配。。。我决不是DTD方面的专家——我在这里声明DTD的方式是否使它成为一个内部定义,而这与XMLSchema的真正DTD无关?我可以扩展XMLSchema.dtd吗?虽然导入公共模式很有用,但在当前的问题上似乎没有多大帮助。我想在模式中声明实体(常量),而不是共享类型。Mads Hansen的帖子似乎暗示这是可能的——但不知何故,我做错了……这似乎奏效了。不幸的是,这似乎也在VisualStudioXML编辑器中伪造了intellisense。。。我想,赢一些,输一些。。
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;
<import namespace="http://www.example.com/IPO"/>
<?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">

    ...(clipped away)

</xs:schema>
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xs:schema [
  <!ENTITY % magicNumbers SYSTEM "url/to/your/entity/dtd-document">
  %magicNumbers;
]>
<xs:schema ... >