用javascript操作xml

来源:互联网 发布:淘宝网是什么 编辑:程序博客网 时间:2024/06/08 12:40

文中尽量用上所有的操作和属性,以做示范

<script language="JavaScript">
<!--
var doc = new ActiveXObject("Msxml2.DOMDocument"); //ie5.5+,CreateObject("Microsoft.XMLDOM")

//加载文档
//doc.load("b.xml");

//创建文件头
var p = doc.createProcessingInstruction("xml","version=1.0  encoding=gb2312");

    //添加文件头
    doc.appendChild(p);

//用于直接加载时获得根接点
//var root = doc.documentElement;

//两种方式创建根接点
//    var root = doc.createElement("students");
    var root = doc.createNode(1,"students","");

    //创建子接点
    var n = doc.createNode(1,"ttyp","");

        //指定子接点文本
        //n.text = " this is a test";
   
    //创建孙接点
    var o = doc.createElement("sex");
        o.text = "男";    //指定其文本

    //创建属性
    var r = doc.createAttribute("id");
        r.value="test";

        //添加属性
        n.setAttributeNode(r);

    //创建第二个属性   
    var r1 = doc.createAttribute("class");
        r1.value="tt";
       
        //添加属性
        n.setAttributeNode(r1);

        //删除第二个属性
        n.removeAttribute("class");

        //添加孙接点
        n.appendChild(o);

        //添加文本接点
        n.appendChild(doc.createTextNode("this is a text node."));

        //添加注释
        n.appendChild(doc.createComment("this is a comment/n"));
   
        //添加子接点
        root.appendChild(n);
   
    //复制接点
    var m = n.cloneNode(true);

        root.appendChild(m);
       
        //删除接点
        root.removeChild(root.childNodes(0));

    //创建数据段
    var c = doc.createCDATASection("this is a cdata");
        c.text = "hi,cdata";
        //添加数据段
        root.appendChild(c);
   
    //添加根接点
    doc.appendChild(root);

    //查找接点
    var a = doc.getElementsByTagName("ttyp");
    //var a = doc.selectNodes("//ttyp");

    //显示改接点的属性
    for(var i= 0;i<a.length;i++)
    {
        alert(a[i].xml);
        for(var j=0;j<a[i].attributes.length;j++)
        {
            alert(a[i].attributes[j].name);
        }
    }

    //修改节点,利用XPATH定位节点
    var b = doc.selectSingleNode("//ttyp/sex");
    b.text = "女";

    //alert(doc.xml);

    //XML保存(需要在服务端,客户端用FSO)
    //doc.save();
   
    //查看根接点XML
    if(n)
    {
        alert(n.ownerDocument.xml);
    }

//-->
</script>

由于用js操作本地xml文件之后save时会permission denied,所以据我所知就只能通过FSO来做。而用FSO,基本上就与文件是否是xml无关。

xml文件:

<root>
  <parent>
    <child1>one</child1>
    <child2>one</child2>
  </parent>
  <parent>
    <child1>two</child1>
    <child2>two</child2>
  </parent>
  <parent>
    ...
  </parent>
</root>

var temp;//要操作的数据

//添加节点
function add(root,parent,child1,child2){
 try{
  var fso = new ActiveXObject(Scripting.FileSystemObject);
  var fileOpen = fso.OpenTextFile(*.xml,1);
  var fileContent = fileOpen.ReadAll();
  fileOpen.close();

  if(fileContent.toString().indexOf(temp) !=-1){
   alert(temp+was already in data.);
  }else{
   fileContent = fileContent.replace(</+root+>,);
   fileContent += <+parent+><+child1+>;
   fileContent += ...;
   fileContent += </+child1+><+child2+>;
   fileContent += ...;
   fileContent += </+child2+></+parent+></+root+>;
   var fileWrite = fso.OpenTextFile(*.xml,2)
   fileWrite.write(fileContent);
   fileWrite.close();
   alert(add successfully!)
  }
 }catch(e){
  alert(fail to add.);
 }
}


//删除节点
function del(root,parent,child1,child2){
 try{
  if( confirm(are you sure to delete symbol:+temp+? ) ){
   var fso = new ActiveXObject(Scripting.FileSystemObject);
   var fileOpen = fso.OpenTextFile(*.xml,1);
   var fileContent = fileOpen.ReadAll();
   fileOpen.close();
   
   var parentArr = fileContent.split(</+parent+>);
   var symbolPos = -2;//不一定是2,只要<0即可
   for (var i=0; i<parentArr.length-1; i++){
    if(parentArr[i].indexOf(temp) != -1){
    symbolPos = i;
    continue;
    }
    parentArr[i] += </+parent+>; 
   }
   if (symbolPos == -2){
    alert(temp+ not found in data.)
   }else{
    if(symbolPos == 0){
     parentArr[0] = <+root+>;
    }else
    fileContent = parentArr.toString().replace(/,/g,)
    var fileWrite = fso.OpenTextFile(*.xml,2);
    fileWrite.write(fileContent);
    fileWrite.close();
    alert(deleted successfully!);
   }
  }
 }catch(e){
  alert(fail to delete.);
 }

 

基本思路:

添加节点
1:读入原先xml文件所有字符,保存为fileContent;
2:去除根结点的封闭节点,即</root>;
3:fileContent += <parent><child1>..</child1><child2>...</child2></parent>;
4:fileContent += </root>;
5:写入xml文件,关闭。
基本上就是用手动输入来代替xml的CreateNode。

删除节点
1:读入原先xml文件所有字符,保存为fileContent;
2:以parent来分割fileContent,保存为parentArr[];
3:循环搜索parentArr[i],利用indexOf(parentArr[i])来判断要 删除的节点里的内容 是否出现在parentArr[i];如果没有找到,则parentArr[i] += parent用来补上split时丢失的parent;如果找到了,则不用 += parent, 并且记录i的值;
4:parentArr.splice(i,1),删去节点;
5:parentArr.toString().replace(/,/g,),用来去除逗号;
6:写入xml文件,关闭。

注意:要注意split带来的节点不易匹配的问题,所以 parentArr[i] += parent 时要小心。 当然split不一定按parent,哪个节点清晰就按哪个split。

 
原创粉丝点击