下面是我写的,菜鸟水平,请求高手给我一个高效率的处理办法
XmlDomTmp.loadXML(result.value);  //这个是上面的XMLDOM

var mtXmllen= BaseXmlDom.selectNodes("//root/ettype").length;  //这个表示FCTYPE的值的不同的个数有几个,比如上面那个有 262 和 263 两个var tmpXmllen=XmlDomTmp.selectNodes("//root/PROCOMM_DETAIL").length;   //表示上面XMLDOM长度

if(mtXmllen!=0 && tmpXmllen!=0) {
var pnode=XmlDomDetail.createElement("root"); //创建一个新XML的root节点 for (var i=0;i<tmpXmllen/mtXmllen;i++)  { 
 var cnode=XmlDomDetail.createElement("PROCOMM_DETAIL");  var FSCID=XmlDomTmp.selectNodes("//root/PROCOMM_DETAIL")(i).getAttribute("FSCID");
 var FPRODUCTID=XmlDomTmp.selectNodes("//root/PROCOMM_DETAIL")(i).getAttribute("FPRODUCTID");
 var FPRODUCTNAME=XmlDomTmp.selectNodes("//root/PROCOMM_DETAIL")(i).getAttribute("FPRODUCTNAME");
cnode.setAttribute("FSCID",FSCID);  //添加相关的属性和值
cnode.setAttribute("FPRODUCTID",FPRODUCTID);
cnode.setAttribute("FPRODUCTNAME",FPRODUCTNAME);

//下面才是把多个原XML的节点变成新XML的一个节点的过程    for (var j=0;j<mtXmllen;j++) //mtXmllen=3
   {
var arrFCTYPE = new Array();
var arrFMONEY = new Array();
var arrFCHGMONEY= new Array();
var mt=XmlDomTmp.selectNodes("//root/PROCOMM_DETAIL[@FPRODUCTID="+FPRODUCTID+"]"); //mt.length =3
    arrFCTYPE[j]=mt(j).getAttribute("FCTYPE");
    arrFMONEY[j]=mt(j).getAttribute("FMONEY");
    arrFCHGMONEY[j]=mt(j).getAttribute("FCHGMONEY");
    //把转换后的几个新节点添加
    cnode.setAttribute("FCTYPE_"+j,arrFCTYPE[j]);
    cnode.setAttribute("FMONEY_"+j,arrFMONEY[j]);
    cnode.setAttribute("FCHGMONEY_"+j,arrFCHGMONEY[j]);


pnode.appendChild(cnode);  //Append all Childs
}
         
XmlDomDetail.loadXML(pnode.xml);

解决方案 »

  1.   

    现在主要是每当客户端操作 FPRODUCTID 一般都会有200-300fctype 一般是3-5 个 这样处理的循环太大,效率很低,但又不适合在服务器端处理
      

  2.   

    XmlDomTmp.selectNodes("//root/PROCOMM_DETAIL")(i)这个用到的太多,把他提出来
    var obj=XmlDomTmp.selectNodes("//root/PROCOMM_DETAIL")(i)
    FSCID=obj.getAttribute("FSCID");
    var FPRODUCTNAME=obj.getAttribute("FPRODUCTNAME");
      

  3.   

    var cnode=XmlDomDetail.createElement("PROCOMM_DETAIL"); 
    应该放在这个之前吧,理论上讲应该是对象尽量晚生成,早释放
    cnode.setAttribute("FSCID",FSCID);  //添加相关的属性和值
    cnode.setAttribute("FPRODUCTID",FPRODUCTID);
    cnode.setAttribute("FPRODUCTNAME",FPRODUCTNAME);
      

  4.   

    var tempNode = XmlDomTmp.selectSingleNode("//root/PROCOMM_DETAIL")
    while(tempNode!=null)
    {
      var tempXPath = "//root/PROCOMM_DETAIL"
      tempXPath += "[@FSCID='" + tempNode.getAttribute("FSCID") + "'"
      tempXPath += " + @FPRODUCTID='" + tempNode.getAttribute("FPRODUCTID") + "'"
      tempXPath += " - @FCTYPE='" + tempNode.getAttribute("FCTYPE") + "']" 
      var tempList = XmlDomTmp.selectNodes(tempXPath);
      if (tempList.length > 0)
      {
        //遍历tempList集合,使用自定义规则构建XmlDomDetail,
        //然后将tempNode节点和tempList中的节点从XmlDomTmp中删除
      }
      else
      {
        //只处理tempNode
      }
      
      tempNode = XmlDomTmp.selectSingleNode("//root/PROCOMM_DETAIL")
    }
      

  5.   

    -_-~! 对XPath不是很熟
    -----------------------------
      ... ...
      var tempXPath = "//root/PROCOMM_DETAIL"
      tempXPath += "[@FSCID='" + tempNode.getAttribute("FSCID") + "'"
      tempXPath += " and @FPRODUCTID='" + tempNode.getAttribute("FPRODUCTID") + "'"
      tempXPath += " and not(@FCTYPE='" + tempNode.getAttribute("FCTYPE") + "')]" 
      ... ...
      

  6.   

    again
    ------------------  var tempXPath = "//root/PROCOMM_DETAIL"
      tempXPath += "[@FSCID='" + tempNode.getAttribute("FSCID") + "'"
      tempXPath += " and @FPRODUCTID='" + tempNode.getAttribute("FPRODUCTID") + "'"
      tempXPath += " and @FCTYPE != '" + tempNode.getAttribute("FCTYPE") + "']" 
      

  7.   

    to 
     xjdawu(无法界定) 我看不太懂你的办法,能不能详细解释下。。谢谢
      

  8.   

    var tempXPath = "//root/PROCOMM_DETAIL"
      tempXPath += "[@FSCID='" + tempNode.getAttribute("FSCID") + "'"
      tempXPath += " and @FPRODUCTID='" + tempNode.getAttribute("FPRODUCTID") + "'"
      tempXPath += " and @FCTYPE != '" + tempNode.getAttribute("FCTYPE") + "']" 这样得到的tempList 长度总是1var tempNode = XmlDomTmp.selectSingleNode("//root/PROCOMM_DETAIL")
    得到的 tempNode也是长度1 呀奇怪
      

  9.   


    按照 无法界定的方法写的新的代码var mtXmllen= BaseXmlDom.selectNodes("//root/ettype").length;  
    var tmpXmllen=XmlDomTmp.selectNodes("//root/PROCOMM_DETAIL").length;   if(mtXmllen!=0 && tmpXmllen!=0) {
      var pnode=XmlDomDetail.createElement("root");
      var tempNode = XmlDomTmp.selectSingleNode("//root/PROCOMM_DETAIL");

      while(tempNode!=null)
       {
    var tempXPath = "//root/PROCOMM_DETAIL";
    tempXPath += "[@FSCID='" + tempNode.getAttribute("FSCID") + "'";
    tempXPath += " and @FPRODUCTID='" + tempNode.getAttribute("FPRODUCTID") + "'";
    tempXPath += " and @FCTYPE != '" + tempNode.getAttribute("FCTYPE") + "']" ;
    var cnode=XmlDomDetail.createElement("PROCOMM_DETAIL"); // Create One ChildNode
    var tempList = XmlDomTmp.selectNodes(tempXPath);
    if (tempList.length > 0)
     {
                //遍历tempList集合,使用自定义规则构建XMLDOM cnode.setAttribute("FSCID",tempNode.getAttribute("FSCID"));
    cnode.setAttribute("FPRODUCTID",tempNode.getAttribute("FPRODUCTID"));
    cnode.setAttribute("FPRODUCTNAME",tempNode.getAttribute("FPRODUCTNAME"));
    cnode.setAttribute("FCTYPE_0",tempNode.getAttribute("FCTYPE"));
    cnode.setAttribute("FCTYPENAME_0",tempNode.getAttribute("FCTYPENAME"));
    cnode.setAttribute("FMONEY_0",tempNode.getAttribute("FMONEY"));
    cnode.setAttribute("FCHGMONEY_0",tempNode.getAttribute("FCHGMONEY"));
    for (var j=0;j<tempList.length;j++) //tempList.length=2 
    {
    cnode.setAttribute("FCTYPE_"+(j+1),tempList(j).getAttribute("FCTYPE"));
    cnode.setAttribute("FCTYPENAME_"+(j+1),tempList(j).getAttribute("FCTYPENAME"));
    cnode.setAttribute("FMONEY_"+(j+1),tempList(j).getAttribute("FMONEY"));
    cnode.setAttribute("FCHGMONEY_"+(j+1),tempList(j).getAttribute("FCHGMONEY"));
    }

         //然后将tempNode节点和tempList中的节点从XmlDomTmp中删除
    var tempDelXPath = "//root/PROCOMM_DETAIL";
    tempDelXPath += "[@FSCID='" + tempNode.getAttribute("FSCID") + "'";
    tempDelXPath += " and @FPRODUCTID='" + tempNode.getAttribute("FPRODUCTID") + "']";
    for(j=mtXmllen;j>0;j-- ){
    XmlDomTmp.childNodes(0).removeChild(XmlDomTmp.selectNodes(tempDelXPath)(j-1));
    }
           }
    else
     {
       //只处理tempNode
    cnode.setAttribute("FSCID",tempNode.getAttribute("FSCID"));
    cnode.setAttribute("FPRODUCTID",tempNode.getAttribute("FPRODUCTID"));
    cnode.setAttribute("FPRODUCTNAME",tempNode.getAttribute("FPRODUCTNAME"));
    cnode.setAttribute("FCTYPE_0",tempNode.getAttribute("FCTYPE"));
    cnode.setAttribute("FCTYPENAME_0",tempNode.getAttribute("FCTYPENAME"));
    cnode.setAttribute("FMONEY_0",tempNode.getAttribute("FMONEY"));
    cnode.setAttribute("FCHGMONEY_0",tempNode.getAttribute("FCHGMONEY"));

            //然后将tempNode节点和tempList中的节点从XmlDomTmp中删除
    var tempDelXPath = "//root/PROCOMM_DETAIL";
    tempDelXPath += "[@FSCID='" + tempNode.getAttribute("FSCID") + "'";
    tempDelXPath += " and @FPRODUCTID='" + tempNode.getAttribute("FPRODUCTID") + "']";
    for(j=mtXmllen;j>0;j-- ){
    XmlDomTmp.childNodes(0).removeChild(XmlDomTmp.selectNodes(tempDelXPath)(j-1));
    }

     }
    pnode.appendChild(cnode);  //Append One Child
    tempNode = XmlDomTmp.selectSingleNode("//root/PROCOMM_DETAIL");
     } //while结束

    XmlDomDetail.loadXML(pnode.xml);----------------------OK????????
      

  10.   

    我的方法主要的地方就是一条XPath语句,找出满足要求的节点集合,从而能够遍历XmlDomTmp
    至于你写的代码,由于对XMLDOM不是很熟悉,所以语法上不知道是否还有可以改进的地方,手头只有本MSXML5.0的SDK,建议去MSDN参考下PS: 建节点如果用XML字符串会不会有效率点?删除节点那段,为什么要又用XPath取一遍?
      

  11.   

    不知道结果是否满足要求
    ------------------------------------
    <script>
    function init()
    {
      if (f.value == "")
        return
      var xml = f.value
      var XmlDomTmp = new ActiveXObject("Msxml2.DOMDocument.5.0");
      var xmlStr = "<Root>"
      XmlDomTmp.async = false;
      XmlDomTmp.load(xml);
      var tempNode = XmlDomTmp.selectSingleNode("//root/PROCOMM_DETAIL");
      var tempRoot = XmlDomTmp.documentElement;
      while(tempNode!=null)
      {
        var _FSCID = tempNode.getAttribute("FSCID")
        var _FPRODUCTID = tempNode.getAttribute("FPRODUCTID")
        var _FCTYPE = tempNode.getAttribute("FCTYPE")
        var _FPRODUCTNAME = tempNode.getAttribute("FPRODUCTNAME")
        var str = '<PROCOMM_DETAIL FSCID="' + _FSCID + '" FPRODUCTID="' + _FPRODUCTID + '" FPRODUCTNAME="' + _FPRODUCTNAME + '"'
          str += ' FCTYPE_0="' + tempNode.getAttribute("FCTYPE") + '"'
          str += ' FMONEY_0="' + tempNode.getAttribute("FMONEY") + '"'
          str += ' FCHGMONEY_0="' + tempNode.getAttribute("FCHGMONEY") + '"'    var tempXPath = "//root/PROCOMM_DETAIL"
        tempXPath += "[@FSCID='" + _FSCID + "' and @FPRODUCTID='" + _FPRODUCTID + "' and @FCTYPE != '" + _FCTYPE + "']"     var tempList = XmlDomTmp.selectNodes(tempXPath);
        if(tempList.length > 0)
        {
          //遍历tempList集合,使用自定义规则构建XmlDomDetail,
          //然后将tempNode节点和tempList中的节点从XmlDomTmp中删除
          for(var i=0; i<tempList.length; i++)
          {
            str += ' FCTYPE_' + (i+1) + '="' + tempList[i].getAttribute("FCTYPE") + '"'
            str += ' FMONEY_' + (i+1) + '="' + tempList[i].getAttribute("FMONEY") + '"'
            str += ' FCHGMONEY_' + (i+1) + '="' + tempList[i].getAttribute("FCHGMONEY") + '"'
            tempRoot.removeChild(tempList[i]);
          }
          str += '/>'
          xmlStr += str;
          
          tempRoot.removeChild(tempNode);
          
          //alert(xmlStr)
          //if (confirm('Quit ?'))
          //{
          //  return;  
          //}
        }    tempNode = XmlDomTmp.selectSingleNode("//root/PROCOMM_DETAIL")
      }
      
      if (xmlStr != "<Root>")
      {
        xmlStr += "</Root>" 
        var XmlDomDetail = new ActiveXObject("Msxml2.DOMDocument.5.0");
        XmlDomDetail.loadXML(xmlStr)
        alert(XmlDomDetail.xml)
      }
    }
    </script>
    <input type="file" name="f" value="">
    <button onclick="init()">init</button>
      

  12.   

    可以把注释符去掉,用来调试
    -----------------------------
          //alert(xmlStr)
          //if (confirm('Quit ?'))
          //{
          //  return;  
          //}