XML元素轉化爲JS對象

  Web客戶端與服務器端傳輸對象,除了使用JSON之外,選擇XML作爲傳輸媒介也是比較常用的一種方法。但在JS腳本中,直接使用XML似乎有點麻煩,因此需要在JS對象與XML文檔之間做一個簡單轉化。


  爲了兼容大部分對象定義,XML文檔採用如下形式傳輸:

<objects>

     <object>

          <field>

               <name>code</name>

               <value>201301</value>

          </field>

          <field>

              <name>name</name>

              <value>張三</value>

          </field>

          <field>

              <name>sex</name>

              <value>男</value>

          <field>

          </field>

              <name>birth</name>

              <value>1990-01-01</value>

          </field>

    </object>

</objects>

  這裏object元素表示一個對象,對象中包含若干個field元素,每個field元素中的name與value分別表示該屬性的名稱和值。


  XML轉化爲JS對象代碼如下:

        //將XML節點轉化爲數組對象<name><value>
        function parseNodesAsArray(nodes){
            var objs = new Array();
            if(nodes == null) return objs;
            for(var i = 0;i < nodes.length;i++){
                if(nodes[i] == null) continue;
                var nvnodes = nodes[i].selectNodes("field");
                if(nvnodes == null || nvnodes.length == 0) continue;
                var newObj = new Object();
                for(var j = 0;j < nvnodes.length;j++){
                    if(nvnodes[j] == null) continue;
                    var nnode = nvnodes[j].selectSingleNode("name");
                    var vnode = nvnodes[j].selectSingleNode("value");
                    var fieldName = GetNodeValue(nnode);
                    var fieldValue = GetNodeValue(vnode);
                    if(fieldName == null || fieldName.length == 0) continue;
                    newObj[fieldName] = fieldValue;
                }
                objs[objs.length] = newObj;
            }
            return objs;
        }


  調用時傳入參數爲object元素集合,如:var objs = parseNodesAsArray(xml.selectNodes("/objects/object"));。

  此外,GetNodeValue爲另外一個獲取屬性的函數,如下:

var GetNodeValue = function(obj){
    var str = "";
    if(obj == null) return str;
    if(window.ActiveXObject){ //IE
        str = obj.text;
    }
    else{ //Mozilla, Firefox, etc.
        try{
            str = obj.childNodes[0].nodeValue;
        }catch(ex){
            str = "";
        }
        if(str == ""){
            try{
                str = obj.nodeValue;
            }catch(ex){
                str = "";
            }
        }
    }
    return str;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章