2010-01-19 69 views
1


文档类型声明和命名空间

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

a)我认为即使我们必须使用在DTD中定义的前缀,我们仍然能够选择这些前缀指向哪些URI?


二)假设我们宣布(在DTD)的元素,其中个人是一个命名空间前缀,这是否意味着XML文档中该元素的所有匹配将需要包括一个前缀“个人”?如果是这种情况,那么这意味着使用DTD我们不能使用默认的命名空间功能?!


感谢名单


编辑:


一个)

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

我确实计划使用XML Schema来代替,但我也想了解DTD的基础知识。


B)

...没有命名空间的URI(也无缺省的命名空间)的概念。

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

<!ATTLIST contact xmlns CDATA #REQUIRED> 


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

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


thanx

回答

4

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

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

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

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

完整的Schema规范可能令人望而生畏,但是我发现一个学习了一个并不那么复杂的适当的子集。在W3Schools的人有一个很好的基础知识。

+1

很好的建议。如果OP正在学习DTD,那么他可能会发现RELAX NG紧凑语法作为启蒙之路的下一步很熟悉。 – 2010-01-19 21:48:28

+0

我很抱歉没有尽快回复,但我的电脑正在维修。无论如何,如果你找到时间...我已经编辑了我的初始文章回复你的回复 – SourceC 2010-01-25 20:27:30

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加上MathML 2.0加上SVG 1.1“doctype的一些例子如何可以工作。 (答案是“不太好”)。

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

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

+1对Cumbayah的建议:如果你有任何选择(尤其是如果你正在做任何涉及名称空间的选择),不要使用旧的DTD。任何替代方案(W3架构,RELAX NG,Schematron ...)都将更适合今天的任务。

+0

谢谢你的帮助 – SourceC 2010-01-27 19:41:08