文档类型声明和命名空间

时间:2010-01-19 19:41:03

标签: xml dtd xml-namespaces


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

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


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


感谢名单


编辑:


A)

  

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

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


b)中

  

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

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

<!ATTLIST contact xmlns CDATA #REQUIRED> 


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

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


感谢名单

2 个答案:

答案 0 :(得分:4)

DTD无论如何都没有名称空间的概念。命名空间概念是在他们构思之后引入的。

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

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

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

完整的Schema规范可能令人生畏,但我发现一个人学到了一个不那么复杂的特定子集。 W3Schools的人们有很好的基础知识。

答案 1 :(得分:3)

  

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

这是正确的。通过在整个DTD中广泛使用参数实体来实现 ,以允许复合doctype的每个部分使用前缀来任意配置:

<!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”doctype。 (答案是“不太好”。)

  

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

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

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