1


我是 XML 新手,目前正在学习文档类型声明。无论如何,当在 DTD 主体中声明元素时,元素名称必须与它在 XML 文档中出现的完全一样,包括任何名称空间前缀,这意味着用户不能定义自己的名称空间,但必须使用 DTD 中定义的前缀。

a) 我假设即使我们必须使用在 DTD 中定义的前缀,我们仍然可以选择这些前缀指向哪些 URI?


b) 假设我们(在 DTD 中)声明一个元素,其中 pers 是命名空间前缀,这是否意味着 XML 文档中该元素的所有出现都需要包含前缀“pers”?如果是这种情况,那么这是否意味着对于 DTD,我们不能使用默认命名空间功能?!


谢谢


编辑:


一个)

实际上,除非有特别好的理由,或者您有简单的语法要求并且不需要名称空间,否则您应该考虑改用 XML 模式。

我确实计划改用 XML Schema,但我也想学习 DTD 的基础知识。


b)

…没有命名空间 URI 的概念(也没有默认命名空间)。

如果我们在 DTD 中声明名为“xmlns”的属性:

<!ATTLIST contact xmlns CDATA #REQUIRED> 


那么 XML 文档可以使用默认命名空间功能(这里的子元素<name>在默认命名空间中):

       ...
<contact xmlns=”www.somewhere.com” … > 
   <name></name>
</contact>       
       ...


谢谢

4

2 回答 2

4

DTD 没有任何名称空间的概念。命名空间概念是在他们的概念之后引入的。

对于 XML 命名空间,重要的部分是命名空间 URI 而不是前缀;前缀可以由用户自由更改。

另一方面,当在 DTD 中给定名称空间“前缀”时,前缀部分仅被视为元素名称的一部分(因为 DTD 没有名称空间概念)。因此,“前缀”不能更改,并且没有命名空间 URI 的概念(也没有默认命名空间)。

真的,除非有特别好的理由,或者您有简单的语法要求并且不需要名称空间,否则您应该考虑改用 XML 模式。

完整的 Schema 规范可能令人生畏,但我发现人们学习了一个并不复杂的足够的子集。W3Schools的人有很好的基础知识入门。

于 2010-01-19T19:57:25.743 回答
3

元素名称必须与其在 XML 文档中的显示完全相同,包括任何名称空间前缀,这意味着用户不能定义自己的名称空间,但必须使用在 DTD 中定义的前缀。

那是对的。可以通过在整个 DTD广泛使用参数实体来允许任意配置复合文档类型的每个部分使用的前缀:

<!ENTITY % mydoc.prefix "mydoc:">
...
<!ENTITY % mydoc.element.qname "%mydoc.prefix;element">
<!ENTITY % mydoc.foo.qname "%mydoc.prefix;foo">
<!ENTITY % mydoc.bar.qname "%mydoc.prefix;bar">
<!ELEMENT %mydoc.element.qname; (%mydoc.foo.qname; | %mydoc.bar.qname;)>

请参阅有关 XHTML 模块化的工作和“DTD XHTML 1.1 plus MathML 2.0 plus SVG 1.1”文档类型,了解如何工作的一些示例。(答案是“不太好”。)

这是否意味着该元素在 XML 文档中的所有出现都需要包含前缀“pers”?

是的,除非您为不同的前缀(或没有前缀)重新定义 DTD 以重新定义相同的元素。虽然您可以这样做(您甚至可以使具有一个前缀的元素具有包含具有另一个前缀的元素的内容模型),但使用多级参数实体编写会非常痛苦,并且您的 DTD 最终会不可读。

+1 对 Cumbayah 的建议:如果您在这件事上有任何选择(特别是如果您正在做任何涉及名称空间的事情),请不要使用陈旧的旧 DTD。任何替代方案(W3 Schema、RELAX NG、Schematron...)都将更适合今天的任务。

于 2010-01-19T20:20:17.153 回答