什么是xml dom命名空间,为什么有些DOM方法最终会有NS?

时间:2013-05-15 13:55:27

标签: javascript dom namespaces xml-namespaces

为什么我需要写它?为什么DOM的某些方法最终会有NS,这些方法的目的是什么?

1 个答案:

答案 0 :(得分: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"

之类的字符串

因此,DOM方法(如 document.getElementByTagNameNS())用于选择特定命名空间的元素

<?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>