涉及到js处理xml字符串的业务,查遍网上方法都没有合适的工具。
没办法自己写了一个,应对比较特殊的业务需求
前端渣,大神勿吐槽,临时凑合用,实现了几个需要用到的方法,自留笔记用。
const sofunXml=function (ElementName) {
this.ElementName=ElementName;
this.xmlStr="<"+ElementName+"></"+ElementName+">";
sofunXml.prototype.attr=function (field,value) {
let domInfo=this.xmlStr.substring(this.ElementName.length+1,this.xmlStr.indexOf(">"));
let infoArray=domInfo.split(" ");
let infoArr=[];
for(let i in infoArray){
if(infoArray[i].length>0){
infoArr.push(infoArray[i])
}
}
if(value!=undefined){ //注入值还是获取值
if(infoArr.length>0 && infoArr[0].length>0){
for(let i in infoArr){
let fieldArr=infoArr[i].split("=");
if(field==fieldArr[0]){
let bf=this.xmlStr.substring(0,this.xmlStr.indexOf(field)+field.length);
let af=this.xmlStr.substring(bf.length,this.xmlStr.length);
af=af.substring(af.indexOf(" "),af.length);
this.xmlStr=bf+"=\""+value+"\" "+af;
this.xmlStr=format(this.xmlStr);
return; //替换后结束本次操作
}
}
//没有找到已存在的属性就注入新的属性
let bf=this.xmlStr.substring(0,this.xmlStr.indexOf(">"));
let af=this.xmlStr.substring(this.xmlStr.indexOf(">"),this.xmlStr.length);
this.xmlStr=bf+" "+field+"=\""+value+"\" "+af;
}else{
this.xmlStr =this.xmlStr.substring(0,this.xmlStr.indexOf(">"))+" "+field+"=\""+value+"\" "
+this.xmlStr.substring(this.xmlStr.indexOf(">"),this.xmlStr.length)
}
this.xmlStr=format(this.xmlStr)
}else{ //获取值暂时用不上
}
};
/**
* 节点内部结尾追加
* @param sfXml
*/
sofunXml.prototype.append=function (sfXml) {
let bf=this.xmlStr.substring(0,this.xmlStr.lastIndexOf("<"));
let af=this.xmlStr.substring(this.xmlStr.lastIndexOf("<"),this.xmlStr.length);
if(typeof sfXml =="string"){
this.xmlStr=bf+sfXml+af;
}else{
this.xmlStr=bf+sfXml.xmlStr+af;
}
};
/**
* 节点内开头追加
* @param sfXml
*/
sofunXml.prototype.prepend=function (sfXml) {
let bf=this.xmlStr.substring(0,this.xmlStr.indexOf(">")+1);
let af=this.xmlStr.substring(this.xmlStr.indexOf(">")+1,this.xmlStr.length)
if(typeof sfXml =="string"){
this.xmlStr=bf+sfXml+af;
}else{
this.xmlStr=bf+sfXml.xmlStr+af;
}
};
sofunXml.prototype.clone=function () {
let res=new sofunXml();
res.ElementName=this.ElementName;
res.xmlStr=this.xmlStr;
return res;
};
//去除多余空格
function format(str) {
let reStr=str.replace(/\s\s+/g," ");
return reStr
}
return this;
}
测试方法:
let process=new sofunXml("process");
process.attr("name","省级传阅");
process.attr("name","省级传阅111");
let test=new sofunXml("test");
test.attr("id","test");
let test1=test.clone();
test1.attr("id","test1");
process.append(test);
process.append(test1);
console.log(process)
console.log("xml字符串:"+process.xmlStr)
时间紧急,有点bug,不能像jq那样针对某个对象随时修改属性,但是不影响使用,介意的仁兄可以改改,有更好的方法一定记得告诉我!