下面是我写的,菜鸟水平,请求高手给我一个高效率的处理办法
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);
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);
var obj=XmlDomTmp.selectNodes("//root/PROCOMM_DETAIL")(i)
FSCID=obj.getAttribute("FSCID");
var FPRODUCTNAME=obj.getAttribute("FPRODUCTNAME");
应该放在这个之前吧,理论上讲应该是对象尽量晚生成,早释放
cnode.setAttribute("FSCID",FSCID); //添加相关的属性和值
cnode.setAttribute("FPRODUCTID",FPRODUCTID);
cnode.setAttribute("FPRODUCTNAME",FPRODUCTNAME);
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")
}
-----------------------------
... ...
var tempXPath = "//root/PROCOMM_DETAIL"
tempXPath += "[@FSCID='" + tempNode.getAttribute("FSCID") + "'"
tempXPath += " and @FPRODUCTID='" + tempNode.getAttribute("FPRODUCTID") + "'"
tempXPath += " and not(@FCTYPE='" + tempNode.getAttribute("FCTYPE") + "')]"
... ...
------------------ var tempXPath = "//root/PROCOMM_DETAIL"
tempXPath += "[@FSCID='" + tempNode.getAttribute("FSCID") + "'"
tempXPath += " and @FPRODUCTID='" + tempNode.getAttribute("FPRODUCTID") + "'"
tempXPath += " and @FCTYPE != '" + tempNode.getAttribute("FCTYPE") + "']"
xjdawu(无法界定) 我看不太懂你的办法,能不能详细解释下。。谢谢
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 呀奇怪
按照 无法界定的方法写的新的代码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????????
至于你写的代码,由于对XMLDOM不是很熟悉,所以语法上不知道是否还有可以改进的地方,手头只有本MSXML5.0的SDK,建议去MSDN参考下PS: 建节点如果用XML字符串会不会有效率点?删除节点那段,为什么要又用XPath取一遍?
------------------------------------
<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>
-----------------------------
//alert(xmlStr)
//if (confirm('Quit ?'))
//{
// return;
//}