1

我们使用 XML 来定义一个模式来控制可以在图表工具中显示的内容。模式文件指定可以在图表上放置哪些类型的对象,如何将它们链接在一起,以及这些对象具有哪些属性(即,在编辑器中出现哪些可设置的属性)。

当需要一种新的图表时,会编写一个新的模式,并根据 .xsd 进行验证。为了使模式文件更加模块化和更易于维护,我们使用<!ENTITY>声明来包含单独的文件。一起属于特定图表元素但可能出现在模式中的多个位置的属性列表等被写入单独的 XML 文件,然后包含在相关位置。说:

<!-- Nameing etc. just as an example -->
<!ENTITY CommonProerties1 SYSTEM "file:../CommonProperties1.xml">
<!ENTITY CommonProerties2 SYSTEM "file:../CommonProperties2.xml">

然后在架构中的某处:

<Node shape="Square">
    &CommonProperties1;
    <!-- Specific properties go here -->
</Node>

这可以防止大量复制粘贴的东西,使维护变得困难,并让公共属性也可以与多个模式共享。

问题是现在,一些通用属性也有基本元素,例如标志和枚举组等。我想让每个文件(例如“CommonProperties1.xml”)能够包含来自另一个基本集,例如作为“CommonEnums.xml”,但我认为使用 !ENTITY 声明是不可能的。

您不能在 !DOCTYPE 标头之外声明 !ENTITY ,如果您添加标头,那么它会使顶级 XML 文件无效,因为它通过文件获得标头声明 1.2。

有没有人尝试过做类似的事情,你做了什么来解决/解决问题?我错过了更好的选择吗?

4

1 回答 1

3

一般系统实体被设计为用作文本包含/替换机制。我见过深度嵌套的结构,其中包含极其复杂的样板。

因此,让我们更深入地研究您的问题陈述。

在您的示例中,为什么您认为在文档类型声明中不能有 CommonEnums 的 !ENTITY 声明,以便在解析包含实体时识别实体引用 &CommonEnums?您在声明时遇到问题的这些系统实体有什么特别之处?如果您的目标是避免在文档序言的解析过程中声明它们,那么,不,您无法解决这个问题。

您不能在 !DOCTYPE 标头之外声明 !ENTITY

这在某种意义上是正确的,但有一个有用的漏洞。您可以在外部 DTD 中声明一般实体,在这种情况下,它们的声明在文档序言中是不可见的。我不知道这对您的情况是否有帮助,但是在 DTD 中声明您的外部通用系统实体将允许您从引用它们的文档实例和片段中“隐藏”它们。

如果我怀疑您的目标是可重用性、模块化和简洁性,那么我认为您可以通过外部 DTD 做您想做的事。但是为了利用这个特性,您可能必须或多或少地承担创建 DTD 的所有工作,以达到满足您的 XML 处理器所需的任何程度,这可能会坚持根据 DTD 验证您的文档结构。

于 2009-05-05T03:59:07.180 回答