【工具】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);
相关推荐
雨季66611 分钟前
Flutter 三端应用实战:OpenHarmony 简易“动态内边距调节器”交互模式深度解析
javascript·flutter·ui·交互·dart
会飞的战斗鸡44 分钟前
JS中的链表(含leetcode例题)
javascript·leetcode·链表
方也_arkling1 小时前
别名路径联想提示。@/统一文件路径的配置
前端·javascript
qq_177767371 小时前
React Native鸿蒙跨平台剧集管理应用实现,包含主应用组件、剧集列表、分类筛选、搜索排序等功能模块
javascript·react native·react.js·交互·harmonyos
qq_177767372 小时前
React Native鸿蒙跨平台自定义复选框组件,通过样式数组实现选中/未选中状态的样式切换,使用链式调用替代样式数组,实现状态驱动的样式变化
javascript·react native·react.js·架构·ecmascript·harmonyos·媒体
web打印社区2 小时前
web-print-pdf:突破浏览器限制,实现专业级Web静默打印
前端·javascript·vue.js·electron·html
烬头88212 小时前
React Native鸿蒙跨平台采用了函数式组件的形式,通过 props 接收分类数据,使用 TouchableOpacity实现了点击交互效果
javascript·react native·react.js·ecmascript·交互·harmonyos
Amumu121382 小时前
Vuex介绍
前端·javascript·vue.js
2601_949809593 小时前
flutter_for_openharmony家庭相册app实战+相册详情实现
javascript·flutter·ajax
qq_177767373 小时前
React Native鸿蒙跨平台通过Animated.Value.interpolate实现滚动距离到动画属性的映射
javascript·react native·react.js·harmonyos