java xmlns_Html,xmlns,命名空间,xml

你的问题中存在很多混乱,如果不编写关于XML命名空间的完整教程,解决它并不容易 . 我将尽可能地覆盖它们与(X)HTML的关系 .

首先,命名空间的目的是分离词汇表 . 因此,例如, http://www.w3.org/1999/xhtml 命名空间中的 title 元素可以与 http://www.w3.org/2000/svg 命名空间中的 title 元素区分开来,当它们出现在同一文档中或由公共处理器处理时 .

其次,忘记 http://www.w3.org/2000/xmlns/ 命名空间 . 它的作用主要在幕后,你很少需要担心它 .

接下来,我们需要区分null名称空间,默认名称空间和前缀引用的名称空间 .

当XML文件没有定义 xmlns= 属性时,所有未加前缀的元素都被认为是'in the null namespace'或'in no namespace',这相当于同一件事 .

当XML元素具有 xmlns= 属性时,它及其后代元素(如果它们没有前缀)被称为'in the default namespace',其中默认命名空间是xmlns属性的值 .

前缀元素始终位于由元素的元素或祖先中的 xmlns:prefix= 属性映射的命名空间中 .

现在,XHTML词汇表被定义为 http://www.w3.org/1999/xhtml 命名空间中的元素,因此正确编写的XHTML文档将声明该命名空间作为默认命名空间,或者将前缀映射到命名空间,在这种情况下,所有XHTML元素都需要在他们的名字上加上那个前缀 . (由于下面给出的原因,后一种情况不会经常发生) .

因此,在使用XML解析器解析XHTML时,名称空间映射需要存在 .

但是,XPath没有默认命名空间的概念 . 如果未将前缀放在xpath中指定的元素上,它将尝试匹配null命名空间中的元素 . 如果XHTML元素位于 http://www.w3.org/1999/xhtml 名称空间中,则xpath将不匹配任何内容 .

这是它开始变得复杂的地方 - 浏览器 .

如果您按照自己的意愿向浏览器提供XHTML网页,使用XML内容类型(如application / xhtml xml),浏览器将使用XML解析器加载它,并应用上述所有规则 . 如果您不包含 xmlns="http://www.w3.org/1999/xhtml" 属性,浏览器将无法理解如何处理它,只会将文件显示为原始XML结构 .

但是,因为IE直到IE9不支持XML内容类型,所以几乎没有人以这种方式提供网页 . 相反,他们使用“text / html”内容类型,在这种情况下,浏览器根本不使用XML解析器,它使用HTML .

HTML解析器就好了忽略命名空间以映射前缀,并简单地"knows"哪些元素名称属于哪些命名空间 . 这使得它最终不那么灵活,但在其专业领域内,更强大且易于使用 . (在上面的 title 元素的示例中,它通过查看 title 的祖先元素来确定应用哪个命名空间)这就是为什么XHTML文档不能识别它们的原因 .

浏览器(无论如何都是现代的),然后有专门的DOM类API方法和CSS规则来隐藏所有这些命名空间复杂性远离javascript和css作者,因此,在大多数情况下,网页作者可以安全地忽略命名空间 .

但是,独立的HTML解析器并不总是这样做 . 相反,它们将所有元素放在null命名空间中,这意味着可以使用标准DOM API找到不包含元素名称前缀的xpath . 对于大多数实际用途,这与浏览器使用HTML解析器进行解析时的情况相同 .

因此,总而言之,您需要了解您是使用XML还是HTML解析器解析XHTML,以及该特定解析器如何将元素分配给命名空间,以便能够编写正确的xpath来查询其中的元素该文件 .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值