前言
后端传来一个xml字符串数组 类似 ['<a>1</a>','<b>2</b>']
将它转为js对象方便后续操作
一、使用match正则匹配 简单易用
function transformXml(xmls){
const data = {}
const tagRegExp = /(?<=(<)).*?(?=(>))/
const dataRegExp = /(?<=(>)).*?(?=(<))/
let tagName = ''
let tagData = ''
for (let i = 0; i < xmls.length; i++) {
tagName = xmls[i].match(tagRegExp)[0]
tagData = xmls[i].match(dataRegExp)[0]
data[tagName] = tagData
}
return data
}
二、 通过操作dom来取值
function transformXML(XMLs){
const data={}
let str = ''
const root = document.createElement("data")
for (let i = 0; i < XMLs.length; i++) {
str += XMLs[i]
}
root.innerHTML = str
const children = root.childNodes
for (let i = 0;i<children.length;i++){
data[children[i].nodeName] = children[i].innerHTML
}
return data
}
2022/3/8 更新
发现后端可能会传过来一个xml字符串 类似
const xml = `
<a>
<b bbb="这是b标签属性">123</b>
<c ccc="这是c标签属性" ddd="这是c标签第二个属性">
<d abc="这是属性">123</d>
<e>123</e>
</c>
</a>
`
这种情况下 之前的两种方法都不再能使用
三、递归调用将xml字符串转为js对象
const xml = `
<a>
<b bbb="这是b标签属性">123</b>
<c ccc="这是c标签属性" ddd="这是c标签第二个属性">
<d abc="这是属性">123</d>
<e>123</e>
</c>
</a>
`
function transformXml(xmls){
let root = new DOMParser().parseFromString(xmls,'text/xml')
const rootChildren = root.children;
function generate(rootChildren) {
const d1 = {}
for (let i = 0; i < rootChildren.length; i++) {
const child = rootChildren[i];
if (child.children.length >0) {
d1[child.nodeName] = generate(child.children);
if (child.attributes != null){
for (const key in child.attributes) {
if (child.attributes[key].value != null){
d1[child.nodeName][child.attributes[key].name] = child.attributes[key].value;
}
}
}
} else {
const d2 = {}
if (child.childNodes[0] != null){
d2['text'] = child.childNodes[0].nodeValue;
}else {
d2['text'] = ''
}
if (child.attributes != null){
for (const key in child.attributes) {
if (child.attributes[key].value != null){
d2[child.attributes[key].name] = child.attributes[key].value;
}
}
}
d1[child.nodeName] = d2
}
}
return d1
}
return generate(rootChildren);
}
transformXml(xml)
json序列化后输出如下
{
"a":{
"b":{
"text":"123",
"bbb":"这是b标签属性"
},
"c":{
"d":{
"text":"123",
"abc":"这是属性"
},
"e":{
"text":"123"
},
"ccc":"这是c标签属性",
"ddd":"这是c标签第二个属性"
}
}
}
此方法也可代替之前两种方法 择易使用
四、如果你对自己的代码能力不抱有信心,请使用造好的轮子
fast-xml-parser