为什么我需要写它?为什么DOM的某些方法在其末尾有NS,这些方法的目的是什么?
问问题
159 次
1 回答
3
命名空间旨在解决<tagname>
冲突
考虑这个 XML 树:
<aaa xmlns="http://my.org">
<bbb xmlns="http://your.org">hello</bbb>
<bbb>hello</bbb>
</aaa>
第一个<bbb>
标签属于命名空间http://my.org
另一个属于命名空间http://your.org
另一个例子
<company xmlns="http://someschema.org/company"
xmlns:chairman="http://someschema.org/chairman">
<nameValue>Microsoft</nameValue>
<chairman:nameValue>Bill Gates</chairman:nameValue>
<countryValue>USA</countryValue>
</company>
在那里你可以看到两个<nameValue>
标签,一个是公司的名字,一个是董事长的名字……但是这个冲突是用前缀解决的!
另一种写法是:
<com:company
xmlns:com="http://someschema.org/company"
xmlns:cha="http://someschema.org/chairman">
<com:nameValue> Microsoft </com:nameValue>
<cha:nameValue> Bill Gates </cha:nameValue>
<com:countryValue> USA </com:countryValue>
</com:company>
因此,如果您不指定前缀,则您定义的是默认命名空间
xmlns="http://default-namespace.org"
xmlns:nondefault="http://non-default-namespace.org"
意味着,例如,一个后代元素<sometest>
属于http://default-namespace.org
<nondefault:anotherone>
相反属于http://non-default-namespace.org
为什么使用 URL 作为命名空间字符串?因为它们标识了一个没有冲突风险的认证来源(域名只能由一个人拥有),所以您放入xmlns
属性中的 URL 不会以某种方式下载或解析,它只是一个唯一标识您的标签命名空间的字符串. 您可以以同样的方式使用例如字符串,例如xmlns="com.yourcompany.yournamespace"
因此,诸如document.getElementByTagNameNS()之类的 DOM 方法旨在选择特定命名空间的元素
<?php
// asking php some help here
// page must be served as application/xml otherwise
// getElementsByTagNameNS will not work !!!
header("Content-Type: application/xml; charset=UTF-8");
echo '<?xml version="1.0" encoding="UTF-8" ?>';
?>
<html xmlns="http://www.w3.org/1999/xhtml">
<com:company
xmlns:com="http://someschema.org/company"
xmlns:cha="http://someschema.org/chairman">
<p>this is html!</p>
<com:nameValue> Microsoft </com:nameValue>
<cha:nameValue> Bill Gates </cha:nameValue>
<com:countryValue> USA </com:countryValue>
<p>this is html!</p>
</com:company>
<script>
//<![CDATA[
window.onload = function(){
alert("html paragraphs: " + document.getElementsByTagNameNS(
"http://www.w3.org/1999/xhtml", "p").length);
// selects both <com:name> and <cha:name>
alert("any nameValue: " + document.getElementsByTagName(
"nameValue").length);
// selects only <com:name>
alert("company nameValue: " + document.getElementsByTagNameNS(
"http://someschema.org/company", "nameValue").length);
// selects only <cha:name>
alert("chairman nameValue: " + document.getElementsByTagNameNS(
"http://someschema.org/chairman", "nameValue").length);
};
//]]>
</script>
</html>
于 2013-05-16T06:25:35.430 回答