文档类型声明和命名空间

Sou*_*ceC 1 xml dtd xml-namespaces


\n\n

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

\n\n

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

\n\n


\n\n

b) 假设我们(在 DTD 中)声明一个元素,其中 pers 是命名空间前缀,这是否意味着 XML 文档中该元素的所有出现都需要包含前缀 \xe2\x80\x9cpers\xe2\x80\x9d?如果是这样的话,那就意味着通过 DTD,我们可以\xe2\x80\x99t 使用默认的命名空间功能?!

\n\n


\n\n

谢谢

\n\n


\n\n

编辑:

\n\n


\n\n

A)

\n\n
\n

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

\n
\n\n

我确实计划改用 XML Schema,但我\xe2\x80\x99d 也喜欢学习 DTD 的基础知识。

\n\n


\n\n

b)

\n\n
\n

\xe2\x80\xa6 没有命名空间 URI 的概念(也没有默认命名空间)。

\n
\n\n

如果我们在 DTD 中声明名为 \xe2\x80\x9cxmlns\xe2\x80\x9d 的属性:

\n\n
<!ATTLIST contact xmlns CDATA #REQUIRED> \n
Run Code Online (Sandbox Code Playgroud)\n\n


\n\n

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

\n\n
       ...\n<contact xmlns=\xe2\x80\x9dwww.somewhere.com\xe2\x80\x9d \xe2\x80\xa6 > \n   <name></name>\n</contact>       \n       ...\n
Run Code Online (Sandbox Code Playgroud)\n\n


\n\n

谢谢

\n

Cum*_*yah 5

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

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

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

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

完整的模式规范可能令人望而生畏,但我发现人们学习了某个足够的子集,而且并不那么复杂。W3Schools的人员提供了很好的基础知识入门书。