2

为什么我需要写它?为什么DOM的某些方法在其末尾有NS,这些方法的目的是什么?

4

1 回答 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 回答