在B/S系统中经常需要在客户端和服务器端之间交互数据,这些数据一般都是在客户端由Javscript组织然后发回服务器。对于一些复杂的数据我们一般用xml的格式组织。本文将给出javascript对xml的一些基本操作。在javascript中是利用MSXml2组件对xml进行操作。该组件将xml加载到内存中形成一个树状的数据结构,可以利用XPath语言对其进行查询。首先需要创建一个MSxml2.DOMDocument的对象,如下:varxmlDoc=newActiveXObject(MSxml2.DOMDocument);,如果是ie5以上版本可以这样:CreateObject(“Microsoft.XMLDom);创建了dom对象以后就可以用它加载一个xml文件或一段xml字符串,如下:varstrFilePath=“file.xml”;xmlDoc.load(strFilePath);//加载xml文件varstrXml=“?xml,version=1.0?rootnodetext=”Name”//root”;xmlDoc.loadXml(strXml);//加载xml字符串当然还可以创建一个空的DOCDocument,然后向里面填写内容。首先要创建xml的头(?xml,version=’1.0’?),如下:var=xmlDoc.createProcessingInstruction(xml,version='1.0');xmlDoc.appendChild(head);接下来为xml创建节点,如下:varrootNode=xmlDoc.createNode(1,Hello,);//参数1-节点类型;参数2-节点名称;参数3-节点的命名空间为节点创建属性,varattribut=xmlDoc.createAttribute(Name);//参数-属性名称Attribute.value=“programer”;//为属性赋值rootNode.setAttributeNode(attribut);//将属性附加到节点上为节点添加文本值,rootNode.value=“WhoamI”;可以直接创建一个文本节点作为当前节点的子节点rootNode.appendChild(xmlDoc.createTextNode(“WhoamI”));将节点添加到DOCDocumentxmlDoc.appendChild(rootNode);当然还可以为一个节点创建子节点,如下rootNode.appendChild(xnChileNode);利用XPath查找节点,也可以查找节点集VarmyNode=xmlDoc.selectSingleNode(“//Hello/Node[@Text=’Who’]”);//查找目标的根节点的节点名为Hello,这条语句查询的是Hello节点下的节点名为Node的节点中Text属性//等于”Who”的节点VarmyNodeList=xmlDoc.selectNodes(“//Hello/Node);//查询Hello节点下的全部Node节点删除节点,删除时只能删除某一个节点下的子节点,而不能直接删除孙节点。VarmyNode=xmlDoc.selectSingleNode(“//Hello/Node[@Text=’Who’]”);VarhelloNode=xmlDoc.selectSingleNode(“//Hello”);xmlDoc.removeChild(myNode);//错误xmlDoc.removeChild(helloNode);//正确helloNode.removeChild(myNode);//正确保存结果。可以将xmlDoc中的内容保存到文件中,也可以直接获取它的xml字符串,如下:xmlDoc.save(strFilePath);//保存到文件alert(xmlDoc.xml);//输出xml字符串----------------------------------------------------------------------------------------------------------------------我的xml文件login.xml如下.?xmlversion=1.0encoding=utf-8?logincharacterctext=热血value=0/cctext=弱气value=1/cctext=激情value=2/cctext=冷静value=3/cctext=冷酷value=4/c/characterweaponwtext=光束剑value=0/wwtext=光束配刀value=1/w/weaponeconomypropertyptext=平均型value=0/pptext=重视攻击value=1/pptext=重视敏捷value=2/pptext=重视防御value=3/pptext=重视命中value=4/p/economyproperty/login现在我需要对这个xml文件的内容进行操作.首先,我们需要加载这个xml文件,js中加载xml文件,是通过xmldom来进行的.//加载xml文档loadxml=function(xmlfile){varxmldoc;if(window.activexobject){xmldoc=newactivexobject('microsoft.xmldom');xmldoc.async=false;xmldoc.load(xmlfile);}elseif(document.implementation&&document.implementation.createdocument){xmldoc=document.implementation.createdocument(',',null);xmldoc.load(xmlfile);}else{returnnull;}returnxmldoc;}xml文件对象出来了,接下去我就要对这个文档进行操作了.比如说,我们现在需要得到节点login/weapon/w的第一个节点的属性,那么我们可以如下进行.//首先对xml对象进行判断checkxmldocobj=function(xmlfile){varxmldoc=loadxml(xmlfile);if(xmldoc==null){alert('您的浏览器不支持xml文件读取,于是本页面禁止您的操作,推荐使用ie5.0以上可以解决此问题!');window.location.href='/index.aspx';}returnxmldoc;}//然后开始获取需要的login/weapon/w的第一个节点的属性值varxmldoc=checkxmldocobj('/ebs/xml/login.xml');varv=xmldoc.getelementsbytagname('login/weapon/w')[0].childnodes.getatspanibute('text')而我在我的程序中的写法是这样子的,当然我在程序中的写法是已经应用到实际中的了.一并给出来,以供查看initializeselect=function(oid,xpath){varxmldoc=checkxmldocobj('/ebs/xml/login.xml');varn;varl;vare=$(oid);if(e!=null){n=xmldoc.getelementsbytagname(xpath)[0].childnodes;l=n.length;for(vari=0;il;i++){varoption=document.createelement('option');option.value=n[i].getatspanibute('value');option.innerhtml=n[i].getatspanibute('text');e.appendchild(option);}}}上面的访问代码中,我们是通过xmldoc.getelementsbytagname(xpath)来进行的.还可以通过xmldoc.documentelement.childnodes(1)..childnodes(0).getatspanibute('text')进行访问.一些常用方法:xmldoc.documentelement.childnodes(0).nodename,可以得到这个节点的名称.xmldoc.documentelement.childnodes(0).nodevalue,可以得到这个节点的值.这个值是来自于这样子的xml格式:ab/b,于是可以得到b这个值.xmldoc.documentelement.childnodes(0).haschild,可以判断是否有子节点根据我的经验,最好是使用getelementsbytagname(xpath)的方法对节点进行访问,因为这样子可以直接通过xpath来定位节点,这样子会有更好的性能.scriptlanguage=JavaScript!--vardoc=newActiveXObject(Msxml2.DOMDocument);//ie5.5+,CreateObject(Microsoft.XMLDOM)//加载文档//doc.load(b.xml);//创建文件头varp=doc.createProcessingInstruction(xml,version='1.0'encoding='gb2312');//添加文件头doc.appendChild(p);//用于直接加载时获得根接点//varroot=doc.documentElement;//两种方式创建根接点//varroot=doc.createElement(students);varroot=doc.createNode(1,students,);//创建子接点varn=doc.createNode(1,ttyp,);//指定子接点文本//n.text=thisisatest;//创建孙接点varo=doc.createElement(sex);o.text=男;//指定其文本//创建属性varr=doc.createAttribute(id);r.value=test;//添加属性n.setAttributeNode(r);//创建第二个属性varr1=doc.createAttribute(class);r1.value=tt;//添加属性n.setAttributeNode(r1);//删除第二个属性n.removeAttribute(class);//添加孙接点n.appendChild(o);//添加文本接点n.appendChild(doc.createTextNode(thisisatextnode.));//添加注释n.appendChild(doc.createComment(thisisacomment\n));//添加子接点root.appendChild(n);//复制接点varm=n.cloneNode(true);root.appendChild(m);//删除接点root.removeChild(root.childNodes(0));//创建数据段varc=doc.createCDATASection(thisisacdata);c.text=hi,cdata;//添加数据段root.appendChild(c);//添加根接点doc.appendChild(root);//查找接点vara=doc.getElementsByTagName(ttyp);//vara=doc.selectNodes(//ttyp