【工具】XML和JSON互相转换

1、JSON解析为XML

javascript 复制代码
function parseJSONToXML(json) {
  let xmlDoc = document.implementation.createDocument(null, '');

  function parseValue(value, parentElement) {
    if (Array.isArray(value)) {
      for (let item of value) {
        let arrayElement = xmlDoc.createElement(parentElement.tagName);
        parseValue(item, arrayElement);
        if (parentElement) {
          parentElement.appendChild(arrayElement);
        }
      }
    } else if (typeof value === 'object') {
      parseObject(value, parentElement);
    } else {
      parentElement.textContent = value;
    }
  }

  function parseObject(obj, parentElement) {
    for (let key in obj) {
      if (obj.hasOwnProperty(key)) {
        let value = obj[key];
        let element = xmlDoc.createElement(key);

        parseValue(value, element);

        if (parentElement) {
          parentElement.appendChild(element);
        } else {
          xmlDoc.appendChild(element);
        }
      }
    }
  }

  parseObject(json, null);

  let serializer = new XMLSerializer();
  return '<?xml version="1.0" encoding="UTF-8"?>' + serializer.serializeToString(xmlDoc);
}

// 使用示例
let json = {
  root: {
    name: 'John',
    age: 30,
    addresses: [
      { street: 'Main St', city: 'City1' },
      { street: 'Second St', city: 'City2' }
    ]
  }
};

let xmlString = parseJSONToXML(json);
console.log(xmlString);

2、XML解析为JSON

javascript 复制代码
function parseXMLToJSON(xml) {
  let parser = new DOMParser();
  let xmlDoc = parser.parseFromString(xml, 'text/xml');

  function parseElement(element) {
    let obj = {};
    if (element.hasChildNodes()) {
      let nestedElements = Array.from(element.children);
      if (nestedElements.length > 0) {
        nestedElements.forEach((nestedElement) => {
          let key = nestedElement.tagName;
          let value = parseElement(nestedElement);
          if (obj.hasOwnProperty(key)) {
            if (!Array.isArray(obj[key])) {
              obj[key] = [obj[key]];
            }
            obj[key].push(value);
          } else {
            obj[key] = value;
          }
        });
      } else {
        obj = element.textContent;
      }
    }
    return obj;
  }

  let rootNode = xmlDoc.documentElement;
  let json = {};
  let rootElement = parseElement(rootNode);
  json[rootNode.tagName] = rootElement;

  return JSON.stringify(json);
}

// 使用示例
let xmlString = '<?xml version="1.0" encoding="UTF-8"?><root><name>John</name><age>30</age><addresses><street>Main St</street><city>City1</city></addresses><addresses><street>Second St</street><city>City2</city></addresses></root>';

let json = parseXMLToJSON(xmlString);
console.log(json);
相关推荐
汤姆Tom几秒前
前端转战后端:JavaScript 与 Java 对照学习指南(第三篇 —— Map 对象)
java·javascript·全栈
juma90023 分钟前
最近在搞PCS储能双向变流器的Simulink仿真时踩了不少坑,尤其是功率控制环的配合调试简直让人头秃。咱们直接打开仿真模型,先从系统架构开始盘
javascript
feiyangqingyun9 分钟前
Qt/C++地图最简示例/在线离线切换/地图视图切换/执行各种js函数交互
javascript·c++·qt
哈哈~haha10 分钟前
ui5_Walkthrough_Step 7:JSON Model
json·mvc·module·ui5
m0_7400437318 分钟前
v-bind 和 v-model 的核心区别
前端·javascript·vue.js
集成显卡21 分钟前
AI取名大师 | 使得 uni-app 兼容 vue3 同名简写语法糖的 vite 插件
javascript·vue.js
unicrom_深圳市由你创科技21 分钟前
使用 Vue3 + Nest.js 构建前后端分离项目的完整指南
开发语言·javascript·状态模式
重铸码农荣光22 分钟前
从零实现一个「就地编辑」组件:深入理解 OOP 封装与复用的艺术
前端·javascript·前端框架
前端老宋Running23 分钟前
拒绝“无效焦虑”:为什么你 80% 的 useMemo 都在做负优化?
前端·javascript·react.js