活动公告

系统通知
06-22 18:10
系统通知
06-14 00:00
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

XML DOM实例解析JSON数据的实用技巧从基础语法到高级应用提升数据处理效率解决跨平台兼容性挑战

SunJu_FaceMall

3万

主题

3155

科技点

3万

积分

执行版主

碾压王

积分
32876

塔罗立华奏

执行版主 发表于 2025-9-3 21:10:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
引言

在当今的数据驱动世界中,不同格式的数据交换和处理变得日益重要。XML和JSON作为两种最常用的数据交换格式,各有其优势和适用场景。XML DOM(文档对象模型)提供了一种强大的方式来处理XML数据,但当我们需要处理JSON数据时,如何利用XML DOM的优势呢?本文将深入探讨如何使用XML DOM来解析JSON数据,从基础语法到高级应用,帮助您提升数据处理效率并解决跨平台兼容性挑战。

XML DOM基础

什么是XML DOM

XML DOM(Document Object Model)是一种编程接口,用于HTML和XML文档。它定义了文档的逻辑结构以及访问和操作文档的方式。通过DOM,程序员可以创建文档、导航文档结构、添加、修改或删除元素和内容。

XML DOM的结构

XML DOM将XML文档表示为树结构,其中每个元素都是一个节点。这种树结构使得导航和操作文档变得直观和高效。
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <bookstore>
  3.   <book category="cooking">
  4.     <title lang="en">Everyday Italian</title>
  5.     <author>Giada De Laurentiis</author>
  6.     <year>2005</year>
  7.     <price>30.00</price>
  8.   </book>
  9.   <book category="children">
  10.     <title lang="en">Harry Potter</title>
  11.     <author>J.K. Rowling</author>
  12.     <year>2005</year>
  13.     <price>29.99</price>
  14.   </book>
  15. </bookstore>
复制代码

在上面的XML示例中,bookstore是根节点,包含两个book子节点,每个book节点又包含title、author、year和price子节点。

XML DOM的基本操作

使用JavaScript操作XML DOM的基本方法包括:
  1. // 加载XML文档
  2. var xmlDoc = new DOMParser().parseFromString(xmlString, "text/xml");
  3. // 获取根元素
  4. var root = xmlDoc.documentElement;
  5. // 获取所有指定标签名的元素
  6. var books = root.getElementsByTagName("book");
  7. // 遍历元素
  8. for (var i = 0; i < books.length; i++) {
  9.     var title = books[i].getElementsByTagName("title")[0].childNodes[0].nodeValue;
  10.     console.log(title);
  11. }
  12. // 获取属性值
  13. var category = books[0].getAttribute("category");
复制代码

JSON数据基础

什么是JSON

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。它基于JavaScript编程语言的一个子集,但独立于语言,许多编程语言都有支持JSON的库。

JSON的基本结构

JSON由两种结构组成:

1. 键值对集合(对象)
2. 有序的值列表(数组)
  1. {
  2.   "bookstore": {
  3.     "book": [
  4.       {
  5.         "category": "cooking",
  6.         "title": "Everyday Italian",
  7.         "author": "Giada De Laurentiis",
  8.         "year": 2005,
  9.         "price": 30.00
  10.       },
  11.       {
  12.         "category": "children",
  13.         "title": "Harry Potter",
  14.         "author": "J.K. Rowling",
  15.         "year": 2005,
  16.         "price": 29.99
  17.       }
  18.     ]
  19.   }
  20. }
复制代码

JSON的基本操作

使用JavaScript操作JSON的基本方法包括:
  1. // 解析JSON字符串
  2. var jsonObj = JSON.parse(jsonString);
  3. // 访问对象属性
  4. var bookstore = jsonObj.bookstore;
  5. var books = bookstore.book;
  6. // 遍历数组
  7. for (var i = 0; i < books.length; i++) {
  8.     var title = books[i].title;
  9.     console.log(title);
  10. }
  11. // 将对象转换为JSON字符串
  12. var jsonString = JSON.stringify(jsonObj);
复制代码

使用XML DOM解析JSON数据

虽然XML DOM主要用于处理XML数据,但我们可以通过一些技巧将其应用于JSON数据的解析。这在某些特定场景下非常有用,例如当系统主要使用XML DOM但需要处理JSON数据时。

JSON转XML的基本方法

首先,我们需要将JSON数据转换为XML格式,然后使用XML DOM进行解析。
  1. function jsonToXml(jsonObj, rootName) {
  2.     var xml = '<?xml version="1.0" encoding="UTF-8"?>';
  3.    
  4.     if (rootName === undefined) {
  5.         rootName = "root";
  6.     }
  7.    
  8.     xml += '<' + rootName + '>';
  9.    
  10.     function parseValue(value, key) {
  11.         if (Array.isArray(value)) {
  12.             for (var i = 0; i < value.length; i++) {
  13.                 xml += '<' + key + '>';
  14.                 parseObject(value[i]);
  15.                 xml += '</' + key + '>';
  16.             }
  17.         } else if (typeof value === 'object' && value !== null) {
  18.             xml += '<' + key + '>';
  19.             parseObject(value);
  20.             xml += '</' + key + '>';
  21.         } else {
  22.             xml += '<' + key + '>' + value + '</' + key + '>';
  23.         }
  24.     }
  25.    
  26.     function parseObject(obj) {
  27.         for (var key in obj) {
  28.             if (obj.hasOwnProperty(key)) {
  29.                 parseValue(obj[key], key);
  30.             }
  31.         }
  32.     }
  33.    
  34.     parseObject(jsonObj);
  35.    
  36.     xml += '</' + rootName + '>';
  37.    
  38.     return xml;
  39. }
  40. // 示例使用
  41. var jsonData = {
  42.     bookstore: {
  43.         book: [
  44.             {
  45.                 category: "cooking",
  46.                 title: "Everyday Italian",
  47.                 author: "Giada De Laurentiis",
  48.                 year: 2005,
  49.                 price: 30.00
  50.             },
  51.             {
  52.                 category: "children",
  53.                 title: "Harry Potter",
  54.                 author: "J.K. Rowling",
  55.                 year: 2005,
  56.                 price: 29.99
  57.             }
  58.         ]
  59.     }
  60. };
  61. var xmlData = jsonToXml(jsonData, "bookstore");
  62. console.log(xmlData);
复制代码

使用XML DOM解析转换后的XML

一旦我们将JSON转换为XML,就可以使用XML DOM来解析和处理数据:
  1. // 解析XML
  2. var parser = new DOMParser();
  3. var xmlDoc = parser.parseFromString(xmlData, "text/xml");
  4. // 使用DOM方法获取数据
  5. function getBooksFromXml(xmlDoc) {
  6.     var books = [];
  7.     var bookNodes = xmlDoc.getElementsByTagName("book");
  8.    
  9.     for (var i = 0; i < bookNodes.length; i++) {
  10.         var bookNode = bookNodes[i];
  11.         var book = {};
  12.         
  13.         // 获取属性
  14.         if (bookNode.hasAttribute("category")) {
  15.             book.category = bookNode.getAttribute("category");
  16.         }
  17.         
  18.         // 获取子元素
  19.         var titleNode = bookNode.getElementsByTagName("title")[0];
  20.         if (titleNode) {
  21.             book.title = titleNode.textContent || titleNode.innerText || "";
  22.         }
  23.         
  24.         var authorNode = bookNode.getElementsByTagName("author")[0];
  25.         if (authorNode) {
  26.             book.author = authorNode.textContent || authorNode.innerText || "";
  27.         }
  28.         
  29.         var yearNode = bookNode.getElementsByTagName("year")[0];
  30.         if (yearNode) {
  31.             book.year = parseInt(yearNode.textContent || yearNode.innerText || "0");
  32.         }
  33.         
  34.         var priceNode = bookNode.getElementsByTagName("price")[0];
  35.         if (priceNode) {
  36.             book.price = parseFloat(priceNode.textContent || priceNode.innerText || "0");
  37.         }
  38.         
  39.         books.push(book);
  40.     }
  41.    
  42.     return books;
  43. }
  44. var books = getBooksFromXml(xmlDoc);
  45. console.log(books);
复制代码

基础应用实例

实例1:简单的JSON数据解析

假设我们有以下简单的JSON数据:
  1. {
  2.   "person": {
  3.     "name": "John Doe",
  4.     "age": 30,
  5.     "address": {
  6.       "street": "123 Main St",
  7.       "city": "Anytown",
  8.       "state": "CA",
  9.       "zip": "12345"
  10.     }
  11.   }
  12. }
复制代码

我们可以使用XML DOM来解析这些数据:
  1. // JSON数据
  2. var jsonData = {
  3.     person: {
  4.         name: "John Doe",
  5.         age: 30,
  6.         address: {
  7.             street: "123 Main St",
  8.             city: "Anytown",
  9.             state: "CA",
  10.             zip: "12345"
  11.         }
  12.     }
  13. };
  14. // 转换为XML
  15. function jsonToXml(jsonObj, rootName) {
  16.     var xml = '<?xml version="1.0" encoding="UTF-8"?>';
  17.    
  18.     if (rootName === undefined) {
  19.         rootName = "root";
  20.     }
  21.    
  22.     xml += '<' + rootName + '>';
  23.    
  24.     function parseValue(value, key) {
  25.         if (Array.isArray(value)) {
  26.             for (var i = 0; i < value.length; i++) {
  27.                 xml += '<' + key + '>';
  28.                 parseObject(value[i]);
  29.                 xml += '</' + key + '>';
  30.             }
  31.         } else if (typeof value === 'object' && value !== null) {
  32.             xml += '<' + key + '>';
  33.             parseObject(value);
  34.             xml += '</' + key + '>';
  35.         } else {
  36.             xml += '<' + key + '>' + value + '</' + key + '>';
  37.         }
  38.     }
  39.    
  40.     function parseObject(obj) {
  41.         for (var key in obj) {
  42.             if (obj.hasOwnProperty(key)) {
  43.                 parseValue(obj[key], key);
  44.             }
  45.         }
  46.     }
  47.    
  48.     parseObject(jsonObj);
  49.    
  50.     xml += '</' + rootName + '>';
  51.    
  52.     return xml;
  53. }
  54. var xmlData = jsonToXml(jsonData, "data");
  55. // 使用DOM解析
  56. var parser = new DOMParser();
  57. var xmlDoc = parser.parseFromString(xmlData, "text/xml");
  58. // 提取数据
  59. function extractPersonData(xmlDoc) {
  60.     var person = {};
  61.     var personNode = xmlDoc.getElementsByTagName("person")[0];
  62.    
  63.     if (personNode) {
  64.         var nameNode = personNode.getElementsByTagName("name")[0];
  65.         if (nameNode) {
  66.             person.name = nameNode.textContent || nameNode.innerText || "";
  67.         }
  68.         
  69.         var ageNode = personNode.getElementsByTagName("age")[0];
  70.         if (ageNode) {
  71.             person.age = parseInt(ageNode.textContent || ageNode.innerText || "0");
  72.         }
  73.         
  74.         var addressNode = personNode.getElementsByTagName("address")[0];
  75.         if (addressNode) {
  76.             person.address = {};
  77.             
  78.             var streetNode = addressNode.getElementsByTagName("street")[0];
  79.             if (streetNode) {
  80.                 person.address.street = streetNode.textContent || streetNode.innerText || "";
  81.             }
  82.             
  83.             var cityNode = addressNode.getElementsByTagName("city")[0];
  84.             if (cityNode) {
  85.                 person.address.city = cityNode.textContent || cityNode.innerText || "";
  86.             }
  87.             
  88.             var stateNode = addressNode.getElementsByTagName("state")[0];
  89.             if (stateNode) {
  90.                 person.address.state = stateNode.textContent || stateNode.innerText || "";
  91.             }
  92.             
  93.             var zipNode = addressNode.getElementsByTagName("zip")[0];
  94.             if (zipNode) {
  95.                 person.address.zip = zipNode.textContent || zipNode.innerText || "";
  96.             }
  97.         }
  98.     }
  99.    
  100.     return person;
  101. }
  102. var person = extractPersonData(xmlDoc);
  103. console.log(person);
复制代码

实例2:处理JSON数组

考虑以下包含数组的JSON数据:
  1. {
  2.   "employees": [
  3.     {
  4.       "id": 1,
  5.       "name": "John Doe",
  6.       "position": "Developer",
  7.       "skills": ["JavaScript", "HTML", "CSS"]
  8.     },
  9.     {
  10.       "id": 2,
  11.       "name": "Jane Smith",
  12.       "position": "Designer",
  13.       "skills": ["Photoshop", "Illustrator", "UI/UX"]
  14.     },
  15.     {
  16.       "id": 3,
  17.       "name": "Bob Johnson",
  18.       "position": "Manager",
  19.       "skills": ["Leadership", "Communication", "Planning"]
  20.     }
  21.   ]
  22. }
复制代码

我们可以使用XML DOM来解析这些数据:
  1. // JSON数据
  2. var jsonData = {
  3.     employees: [
  4.         {
  5.             id: 1,
  6.             name: "John Doe",
  7.             position: "Developer",
  8.             skills: ["JavaScript", "HTML", "CSS"]
  9.         },
  10.         {
  11.             id: 2,
  12.             name: "Jane Smith",
  13.             position: "Designer",
  14.             skills: ["Photoshop", "Illustrator", "UI/UX"]
  15.         },
  16.         {
  17.             id: 3,
  18.             name: "Bob Johnson",
  19.             position: "Manager",
  20.             skills: ["Leadership", "Communication", "Planning"]
  21.         }
  22.     ]
  23. };
  24. // 转换为XML
  25. function jsonToXml(jsonObj, rootName) {
  26.     var xml = '<?xml version="1.0" encoding="UTF-8"?>';
  27.    
  28.     if (rootName === undefined) {
  29.         rootName = "root";
  30.     }
  31.    
  32.     xml += '<' + rootName + '>';
  33.    
  34.     function parseValue(value, key) {
  35.         if (Array.isArray(value)) {
  36.             for (var i = 0; i < value.length; i++) {
  37.                 xml += '<' + key + '>';
  38.                 parseObject(value[i]);
  39.                 xml += '</' + key + '>';
  40.             }
  41.         } else if (typeof value === 'object' && value !== null) {
  42.             xml += '<' + key + '>';
  43.             parseObject(value);
  44.             xml += '</' + key + '>';
  45.         } else {
  46.             xml += '<' + key + '>' + value + '</' + key + '>';
  47.         }
  48.     }
  49.    
  50.     function parseObject(obj) {
  51.         for (var key in obj) {
  52.             if (obj.hasOwnProperty(key)) {
  53.                 parseValue(obj[key], key);
  54.             }
  55.         }
  56.     }
  57.    
  58.     parseObject(jsonObj);
  59.    
  60.     xml += '</' + rootName + '>';
  61.    
  62.     return xml;
  63. }
  64. var xmlData = jsonToXml(jsonData, "company");
  65. // 使用DOM解析
  66. var parser = new DOMParser();
  67. var xmlDoc = parser.parseFromString(xmlData, "text/xml");
  68. // 提取数据
  69. function extractEmployeesData(xmlDoc) {
  70.     var employees = [];
  71.     var employeeNodes = xmlDoc.getElementsByTagName("employees")[0].getElementsByTagName("employee");
  72.    
  73.     for (var i = 0; i < employeeNodes.length; i++) {
  74.         var employeeNode = employeeNodes[i];
  75.         var employee = {};
  76.         
  77.         var idNode = employeeNode.getElementsByTagName("id")[0];
  78.         if (idNode) {
  79.             employee.id = parseInt(idNode.textContent || idNode.innerText || "0");
  80.         }
  81.         
  82.         var nameNode = employeeNode.getElementsByTagName("name")[0];
  83.         if (nameNode) {
  84.             employee.name = nameNode.textContent || nameNode.innerText || "";
  85.         }
  86.         
  87.         var positionNode = employeeNode.getElementsByTagName("position")[0];
  88.         if (positionNode) {
  89.             employee.position = positionNode.textContent || positionNode.innerText || "";
  90.         }
  91.         
  92.         var skillsNode = employeeNode.getElementsByTagName("skills")[0];
  93.         if (skillsNode) {
  94.             employee.skills = [];
  95.             var skillNodes = skillsNode.getElementsByTagName("skill");
  96.             
  97.             for (var j = 0; j < skillNodes.length; j++) {
  98.                 employee.skills.push(skillNodes[j].textContent || skillNodes[j].innerText || "");
  99.             }
  100.         }
  101.         
  102.         employees.push(employee);
  103.     }
  104.    
  105.     return employees;
  106. }
  107. var employees = extractEmployeesData(xmlDoc);
  108. console.log(employees);
复制代码

高级应用实例

实例3:处理复杂嵌套JSON结构

考虑以下复杂的嵌套JSON数据:
  1. {
  2.   "company": {
  3.     "name": "Tech Corp",
  4.     "established": 2010,
  5.     "departments": [
  6.       {
  7.         "name": "Engineering",
  8.         "head": {
  9.           "name": "John Doe",
  10.           "email": "john@techcorp.com"
  11.         },
  12.         "employees": [
  13.           {
  14.             "id": 1,
  15.             "name": "Alice Smith",
  16.             "role": "Senior Developer",
  17.             "projects": [
  18.               {
  19.                 "id": "P1001",
  20.                 "name": "Website Redesign",
  21.                 "status": "Completed"
  22.               },
  23.               {
  24.                 "id": "P1002",
  25.                 "name": "Mobile App",
  26.                 "status": "In Progress"
  27.               }
  28.             ]
  29.           },
  30.           {
  31.             "id": 2,
  32.             "name": "Bob Johnson",
  33.             "role": "Junior Developer",
  34.             "projects": [
  35.               {
  36.                 "id": "P1002",
  37.                 "name": "Mobile App",
  38.                 "status": "In Progress"
  39.               }
  40.             ]
  41.           }
  42.         ]
  43.       },
  44.       {
  45.         "name": "Marketing",
  46.         "head": {
  47.           "name": "Jane Williams",
  48.           "email": "jane@techcorp.com"
  49.         },
  50.         "employees": [
  51.           {
  52.             "id": 3,
  53.             "name": "Mike Brown",
  54.             "role": "Marketing Manager",
  55.             "projects": [
  56.               {
  57.                 "id": "M1001",
  58.                 "name": "Brand Campaign",
  59.                 "status": "Planning"
  60.               }
  61.             ]
  62.           }
  63.         ]
  64.       }
  65.     ]
  66.   }
  67. }
复制代码

我们可以使用XML DOM来解析这些复杂的数据:
  1. // JSON数据
  2. var jsonData = {
  3.     company: {
  4.         name: "Tech Corp",
  5.         established: 2010,
  6.         departments: [
  7.             {
  8.                 name: "Engineering",
  9.                 head: {
  10.                     name: "John Doe",
  11.                     email: "john@techcorp.com"
  12.                 },
  13.                 employees: [
  14.                     {
  15.                         id: 1,
  16.                         name: "Alice Smith",
  17.                         role: "Senior Developer",
  18.                         projects: [
  19.                             {
  20.                                 id: "P1001",
  21.                                 name: "Website Redesign",
  22.                                 status: "Completed"
  23.                             },
  24.                             {
  25.                                 id: "P1002",
  26.                                 name: "Mobile App",
  27.                                 status: "In Progress"
  28.                             }
  29.                         ]
  30.                     },
  31.                     {
  32.                         id: 2,
  33.                         name: "Bob Johnson",
  34.                         role: "Junior Developer",
  35.                         projects: [
  36.                             {
  37.                                 id: "P1002",
  38.                                 name: "Mobile App",
  39.                                 status: "In Progress"
  40.                             }
  41.                         ]
  42.                     }
  43.                 ]
  44.             },
  45.             {
  46.                 name: "Marketing",
  47.                 head: {
  48.                     name: "Jane Williams",
  49.                     email: "jane@techcorp.com"
  50.                 },
  51.                 employees: [
  52.                     {
  53.                         id: 3,
  54.                         name: "Mike Brown",
  55.                         role: "Marketing Manager",
  56.                         projects: [
  57.                             {
  58.                                 id: "M1001",
  59.                                 name: "Brand Campaign",
  60.                                 status: "Planning"
  61.                             }
  62.                         ]
  63.                     }
  64.                 ]
  65.             }
  66.         ]
  67.     }
  68. };
  69. // 转换为XML
  70. function jsonToXml(jsonObj, rootName) {
  71.     var xml = '<?xml version="1.0" encoding="UTF-8"?>';
  72.    
  73.     if (rootName === undefined) {
  74.         rootName = "root";
  75.     }
  76.    
  77.     xml += '<' + rootName + '>';
  78.    
  79.     function parseValue(value, key) {
  80.         if (Array.isArray(value)) {
  81.             for (var i = 0; i < value.length; i++) {
  82.                 xml += '<' + key + '>';
  83.                 parseObject(value[i]);
  84.                 xml += '</' + key + '>';
  85.             }
  86.         } else if (typeof value === 'object' && value !== null) {
  87.             xml += '<' + key + '>';
  88.             parseObject(value);
  89.             xml += '</' + key + '>';
  90.         } else {
  91.             xml += '<' + key + '>' + value + '</' + key + '>';
  92.         }
  93.     }
  94.    
  95.     function parseObject(obj) {
  96.         for (var key in obj) {
  97.             if (obj.hasOwnProperty(key)) {
  98.                 parseValue(obj[key], key);
  99.             }
  100.         }
  101.     }
  102.    
  103.     parseObject(jsonObj);
  104.    
  105.     xml += '</' + rootName + '>';
  106.    
  107.     return xml;
  108. }
  109. var xmlData = jsonToXml(jsonData, "data");
  110. // 使用DOM解析
  111. var parser = new DOMParser();
  112. var xmlDoc = parser.parseFromString(xmlData, "text/xml");
  113. // 提取数据
  114. function extractCompanyData(xmlDoc) {
  115.     var company = {};
  116.     var companyNode = xmlDoc.getElementsByTagName("company")[0];
  117.    
  118.     if (companyNode) {
  119.         var nameNode = companyNode.getElementsByTagName("name")[0];
  120.         if (nameNode) {
  121.             company.name = nameNode.textContent || nameNode.innerText || "";
  122.         }
  123.         
  124.         var establishedNode = companyNode.getElementsByTagName("established")[0];
  125.         if (establishedNode) {
  126.             company.established = parseInt(establishedNode.textContent || establishedNode.innerText || "0");
  127.         }
  128.         
  129.         var departmentsNode = companyNode.getElementsByTagName("departments")[0];
  130.         if (departmentsNode) {
  131.             company.departments = [];
  132.             var departmentNodes = departmentsNode.getElementsByTagName("department");
  133.             
  134.             for (var i = 0; i < departmentNodes.length; i++) {
  135.                 var departmentNode = departmentNodes[i];
  136.                 var department = {};
  137.                
  138.                 var deptNameNode = departmentNode.getElementsByTagName("name")[0];
  139.                 if (deptNameNode) {
  140.                     department.name = deptNameNode.textContent || deptNameNode.innerText || "";
  141.                 }
  142.                
  143.                 var headNode = departmentNode.getElementsByTagName("head")[0];
  144.                 if (headNode) {
  145.                     department.head = {};
  146.                     
  147.                     var headNameNode = headNode.getElementsByTagName("name")[0];
  148.                     if (headNameNode) {
  149.                         department.head.name = headNameNode.textContent || headNameNode.innerText || "";
  150.                     }
  151.                     
  152.                     var emailNode = headNode.getElementsByTagName("email")[0];
  153.                     if (emailNode) {
  154.                         department.head.email = emailNode.textContent || emailNode.innerText || "";
  155.                     }
  156.                 }
  157.                
  158.                 var employeesNode = departmentNode.getElementsByTagName("employees")[0];
  159.                 if (employeesNode) {
  160.                     department.employees = [];
  161.                     var employeeNodes = employeesNode.getElementsByTagName("employee");
  162.                     
  163.                     for (var j = 0; j < employeeNodes.length; j++) {
  164.                         var employeeNode = employeeNodes[j];
  165.                         var employee = {};
  166.                         
  167.                         var idNode = employeeNode.getElementsByTagName("id")[0];
  168.                         if (idNode) {
  169.                             employee.id = parseInt(idNode.textContent || idNode.innerText || "0");
  170.                         }
  171.                         
  172.                         var empNameNode = employeeNode.getElementsByTagName("name")[0];
  173.                         if (empNameNode) {
  174.                             employee.name = empNameNode.textContent || empNameNode.innerText || "";
  175.                         }
  176.                         
  177.                         var roleNode = employeeNode.getElementsByTagName("role")[0];
  178.                         if (roleNode) {
  179.                             employee.role = roleNode.textContent || roleNode.innerText || "";
  180.                         }
  181.                         
  182.                         var projectsNode = employeeNode.getElementsByTagName("projects")[0];
  183.                         if (projectsNode) {
  184.                             employee.projects = [];
  185.                             var projectNodes = projectsNode.getElementsByTagName("project");
  186.                            
  187.                             for (var k = 0; k < projectNodes.length; k++) {
  188.                                 var projectNode = projectNodes[k];
  189.                                 var project = {};
  190.                                 
  191.                                 var projectIdNode = projectNode.getElementsByTagName("id")[0];
  192.                                 if (projectIdNode) {
  193.                                     project.id = projectIdNode.textContent || projectIdNode.innerText || "";
  194.                                 }
  195.                                 
  196.                                 var projectNameNode = projectNode.getElementsByTagName("name")[0];
  197.                                 if (projectNameNode) {
  198.                                     project.name = projectNameNode.textContent || projectNameNode.innerText || "";
  199.                                 }
  200.                                 
  201.                                 var statusNode = projectNode.getElementsByTagName("status")[0];
  202.                                 if (statusNode) {
  203.                                     project.status = statusNode.textContent || statusNode.innerText || "";
  204.                                 }
  205.                                 
  206.                                 employee.projects.push(project);
  207.                             }
  208.                         }
  209.                         
  210.                         department.employees.push(employee);
  211.                     }
  212.                 }
  213.                
  214.                 company.departments.push(department);
  215.             }
  216.         }
  217.     }
  218.    
  219.     return company;
  220. }
  221. var company = extractCompanyData(xmlDoc);
  222. console.log(company);
复制代码

实例4:使用XPath查询JSON数据

XPath是一种在XML文档中查找信息的语言。我们可以利用XPath来查询转换后的XML数据,从而更高效地提取JSON数据中的特定信息。
  1. // JSON数据
  2. var jsonData = {
  3.     bookstore: {
  4.         book: [
  5.             {
  6.                 category: "cooking",
  7.                 title: "Everyday Italian",
  8.                 author: "Giada De Laurentiis",
  9.                 year: 2005,
  10.                 price: 30.00
  11.             },
  12.             {
  13.                 category: "children",
  14.                 title: "Harry Potter",
  15.                 author: "J.K. Rowling",
  16.                 year: 2005,
  17.                 price: 29.99
  18.             },
  19.             {
  20.                 category: "web",
  21.                 title: "Learning XML",
  22.                 author: "Erik T. Ray",
  23.                 year: 2003,
  24.                 price: 39.95
  25.             }
  26.         ]
  27.     }
  28. };
  29. // 转换为XML
  30. function jsonToXml(jsonObj, rootName) {
  31.     var xml = '<?xml version="1.0" encoding="UTF-8"?>';
  32.    
  33.     if (rootName === undefined) {
  34.         rootName = "root";
  35.     }
  36.    
  37.     xml += '<' + rootName + '>';
  38.    
  39.     function parseValue(value, key) {
  40.         if (Array.isArray(value)) {
  41.             for (var i = 0; i < value.length; i++) {
  42.                 xml += '<' + key + '>';
  43.                 parseObject(value[i]);
  44.                 xml += '</' + key + '>';
  45.             }
  46.         } else if (typeof value === 'object' && value !== null) {
  47.             xml += '<' + key + '>';
  48.             parseObject(value);
  49.             xml += '</' + key + '>';
  50.         } else {
  51.             xml += '<' + key + '>' + value + '</' + key + '>';
  52.         }
  53.     }
  54.    
  55.     function parseObject(obj) {
  56.         for (var key in obj) {
  57.             if (obj.hasOwnProperty(key)) {
  58.                 parseValue(obj[key], key);
  59.             }
  60.         }
  61.     }
  62.    
  63.     parseObject(jsonObj);
  64.    
  65.     xml += '</' + rootName + '>';
  66.    
  67.     return xml;
  68. }
  69. var xmlData = jsonToXml(jsonData, "data");
  70. // 使用DOM解析
  71. var parser = new DOMParser();
  72. var xmlDoc = parser.parseFromString(xmlData, "text/xml");
  73. // 使用XPath查询数据
  74. function queryXmlWithXPath(xmlDoc, xpath) {
  75.     if (xmlDoc.evaluate) {
  76.         // 支持evaluate方法(现代浏览器)
  77.         var nodes = xmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE, null);
  78.         var result = [];
  79.         var node = nodes.iterateNext();
  80.         
  81.         while (node) {
  82.             result.push(node);
  83.             node = nodes.iterateNext();
  84.         }
  85.         
  86.         return result;
  87.     } else {
  88.         // 不支持evaluate方法,使用selectNodes(IE旧版)
  89.         return xmlDoc.selectNodes(xpath);
  90.     }
  91. }
  92. // 查询所有书籍
  93. var allBooks = queryXmlWithXPath(xmlDoc, "//book");
  94. console.log("All books:", allBooks.length);
  95. // 查询所有书籍的标题
  96. var allTitles = queryXmlWithXPath(xmlDoc, "//book/title");
  97. console.log("All titles:");
  98. for (var i = 0; i < allTitles.length; i++) {
  99.     console.log(allTitles[i].textContent);
  100. }
  101. // 查询特定类别的书籍
  102. var cookingBooks = queryXmlWithXPath(xmlDoc, "//book[@category='cooking']");
  103. console.log("Cooking books:");
  104. for (var i = 0; i < cookingBooks.length; i++) {
  105.     var titleNode = cookingBooks[i].getElementsByTagName("title")[0];
  106.     console.log(titleNode.textContent);
  107. }
  108. // 查询价格低于35的书籍
  109. var cheapBooks = queryXmlWithXPath(xmlDoc, "//book[price < 35]");
  110. console.log("Cheap books:");
  111. for (var i = 0; i < cheapBooks.length; i++) {
  112.     var titleNode = cheapBooks[i].getElementsByTagName("title")[0];
  113.     var priceNode = cheapBooks[i].getElementsByTagName("price")[0];
  114.     console.log(titleNode.textContent + " - $" + priceNode.textContent);
  115. }
  116. // 查询2005年出版的书籍
  117. var booksFrom2005 = queryXmlWithXPath(xmlDoc, "//book[year = 2005]");
  118. console.log("Books from 2005:");
  119. for (var i = 0; i < booksFrom2005.length; i++) {
  120.     var titleNode = booksFrom2005[i].getElementsByTagName("title")[0];
  121.     console.log(titleNode.textContent);
  122. }
复制代码

提升数据处理效率的技巧

技巧1:缓存XML DOM对象

当需要多次访问相同的JSON数据时,可以将转换后的XML DOM对象缓存起来,避免重复转换。
  1. // JSON数据
  2. var jsonData = {
  3.     // ... JSON数据
  4. };
  5. // 缓存对象
  6. var domCache = {};
  7. function getXmlDom(jsonObj, rootName) {
  8.     // 生成缓存键
  9.     var cacheKey = JSON.stringify(jsonObj) + (rootName || "");
  10.    
  11.     // 检查缓存
  12.     if (domCache[cacheKey]) {
  13.         return domCache[cacheKey];
  14.     }
  15.    
  16.     // 转换为XML
  17.     function jsonToXml(jsonObj, rootName) {
  18.         // ... 之前的jsonToXml函数实现
  19.     }
  20.    
  21.     var xmlData = jsonToXml(jsonObj, rootName);
  22.    
  23.     // 解析XML
  24.     var parser = new DOMParser();
  25.     var xmlDoc = parser.parseFromString(xmlData, "text/xml");
  26.    
  27.     // 存入缓存
  28.     domCache[cacheKey] = xmlDoc;
  29.    
  30.     return xmlDoc;
  31. }
  32. // 使用缓存
  33. var xmlDoc = getXmlDom(jsonData, "data");
  34. // 多次使用xmlDoc进行查询和操作...
复制代码

技巧2:批量处理数据

当处理大量JSON数据时,可以使用批量处理技术来提高效率。
  1. // 批量处理JSON数据
  2. function processJsonBatch(jsonArray, processor, batchSize) {
  3.     batchSize = batchSize || 100; // 默认批处理大小
  4.     var results = [];
  5.    
  6.     for (var i = 0; i < jsonArray.length; i += batchSize) {
  7.         var batch = jsonArray.slice(i, i + batchSize);
  8.         var batchResults = [];
  9.         
  10.         // 转换批处理数据为XML
  11.         var batchXml = '<?xml version="1.0" encoding="UTF-8"?><batch>';
  12.         for (var j = 0; j < batch.length; j++) {
  13.             batchXml += '<item>' + jsonToXmlString(batch[j]) + '</item>';
  14.         }
  15.         batchXml += '</batch>';
  16.         
  17.         // 解析XML
  18.         var parser = new DOMParser();
  19.         var xmlDoc = parser.parseFromString(batchXml, "text/xml");
  20.         
  21.         // 处理批处理数据
  22.         var itemNodes = xmlDoc.getElementsByTagName("item");
  23.         for (var k = 0; k < itemNodes.length; k++) {
  24.             var itemResult = processor(itemNodes[k], batch[k]);
  25.             batchResults.push(itemResult);
  26.         }
  27.         
  28.         results = results.concat(batchResults);
  29.     }
  30.    
  31.     return results;
  32. }
  33. // 辅助函数:将JSON对象转换为XML字符串
  34. function jsonToXmlString(jsonObj) {
  35.     var xml = '';
  36.    
  37.     function parseValue(value, key) {
  38.         if (Array.isArray(value)) {
  39.             for (var i = 0; i < value.length; i++) {
  40.                 xml += '<' + key + '>';
  41.                 parseObject(value[i]);
  42.                 xml += '</' + key + '>';
  43.             }
  44.         } else if (typeof value === 'object' && value !== null) {
  45.             xml += '<' + key + '>';
  46.             parseObject(value);
  47.             xml += '</' + key + '>';
  48.         } else {
  49.             xml += '<' + key + '>' + value + '</' + key + '>';
  50.         }
  51.     }
  52.    
  53.     function parseObject(obj) {
  54.         for (var key in obj) {
  55.             if (obj.hasOwnProperty(key)) {
  56.                 parseValue(obj[key], key);
  57.             }
  58.         }
  59.     }
  60.    
  61.     parseObject(jsonObj);
  62.    
  63.     return xml;
  64. }
  65. // 示例使用
  66. var jsonArray = [
  67.     { id: 1, name: "Item 1", value: 100 },
  68.     { id: 2, name: "Item 2", value: 200 },
  69.     // ... 更多数据
  70. ];
  71. function processor(xmlNode, originalJson) {
  72.     // 处理每个项目
  73.     var result = {
  74.         id: originalJson.id,
  75.         processedValue: originalJson.value * 2
  76.     };
  77.    
  78.     // 可以使用XML DOM进行额外处理...
  79.    
  80.     return result;
  81. }
  82. var results = processJsonBatch(jsonArray, processor, 50);
  83. console.log(results);
复制代码

技巧3:使用XSLT转换数据

XSLT(Extensible Stylesheet Language Transformations)是一种用于转换XML文档的语言。我们可以使用XSLT来转换JSON数据(先转换为XML)。
  1. // JSON数据
  2. var jsonData = {
  3.     bookstore: {
  4.         book: [
  5.             {
  6.                 category: "cooking",
  7.                 title: "Everyday Italian",
  8.                 author: "Giada De Laurentiis",
  9.                 year: 2005,
  10.                 price: 30.00
  11.             },
  12.             {
  13.                 category: "children",
  14.                 title: "Harry Potter",
  15.                 author: "J.K. Rowling",
  16.                 year: 2005,
  17.                 price: 29.99
  18.             },
  19.             {
  20.                 category: "web",
  21.                 title: "Learning XML",
  22.                 author: "Erik T. Ray",
  23.                 year: 2003,
  24.                 price: 39.95
  25.             }
  26.         ]
  27.     }
  28. };
  29. // 转换为XML
  30. function jsonToXml(jsonObj, rootName) {
  31.     // ... 之前的jsonToXml函数实现
  32. }
  33. var xmlData = jsonToXml(jsonData, "data");
  34. // XSLT转换
  35. function transformXmlWithXslt(xmlData, xsltData) {
  36.     if (window.XSLTProcessor) {
  37.         // 现代浏览器
  38.         var parser = new DOMParser();
  39.         var xmlDoc = parser.parseFromString(xmlData, "text/xml");
  40.         var xsltDoc = parser.parseFromString(xsltData, "text/xml");
  41.         
  42.         var xsltProcessor = new XSLTProcessor();
  43.         xsltProcessor.importStylesheet(xsltDoc);
  44.         
  45.         var resultDocument = xsltProcessor.transformToDocument(xmlDoc);
  46.         var serializer = new XMLSerializer();
  47.         return serializer.serializeToString(resultDocument);
  48.     } else if (window.ActiveXObject) {
  49.         // IE旧版
  50.         var xmlDoc = new ActiveXObject("MSXML2.DOMDocument");
  51.         xmlDoc.loadXML(xmlData);
  52.         
  53.         var xsltDoc = new ActiveXObject("MSXML2.DOMDocument");
  54.         xsltDoc.loadXML(xsltData);
  55.         
  56.         return xmlDoc.transformNode(xsltDoc);
  57.     } else {
  58.         throw new Error("XSLT is not supported in this browser.");
  59.     }
  60. }
  61. // XSLT示例:将书籍列表转换为HTML表格
  62. var xsltData = `<?xml version="1.0" encoding="UTF-8"?>
  63. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  64.     <xsl:output method="html" indent="yes"/>
  65.    
  66.     <xsl:template match="/">
  67.         <html>
  68.             <head>
  69.                 <title>Bookstore</title>
  70.                 <style>
  71.                     table { border-collapse: collapse; width: 100%; }
  72.                     th, td { border: 1px solid #ddd; padding: 8px; text-align: left; }
  73.                     th { background-color: #f2f2f2; }
  74.                     tr:nth-child(even) { background-color: #f9f9f9; }
  75.                 </style>
  76.             </head>
  77.             <body>
  78.                 <h1>Bookstore</h1>
  79.                 <table>
  80.                     <thead>
  81.                         <tr>
  82.                             <th>Title</th>
  83.                             <th>Author</th>
  84.                             <th>Category</th>
  85.                             <th>Year</th>
  86.                             <th>Price</th>
  87.                         </tr>
  88.                     </thead>
  89.                     <tbody>
  90.                         <xsl:for-each select="//book">
  91.                             <tr>
  92.                                 <td><xsl:value-of select="title"/></td>
  93.                                 <td><xsl:value-of select="author"/></td>
  94.                                 <td><xsl:value-of select="@category"/></td>
  95.                                 <td><xsl:value-of select="year"/></td>
  96.                                 <td>$<xsl:value-of select="price"/></td>
  97.                             </tr>
  98.                         </xsl:for-each>
  99.                     </tbody>
  100.                 </table>
  101.             </body>
  102.         </html>
  103.     </xsl:template>
  104. </xsl:stylesheet>`;
  105. // 执行转换
  106. var htmlResult = transformXmlWithXslt(xmlData, xsltData);
  107. console.log(htmlResult);
  108. // 可以将结果显示在页面上
  109. document.body.innerHTML = htmlResult;
复制代码

技巧4:异步处理大型JSON数据

当处理大型JSON数据时,可以使用Web Workers进行异步处理,避免阻塞主线程。
  1. // 主线程代码
  2. function processLargeJsonAsync(jsonData, callback) {
  3.     // 创建Web Worker
  4.     var worker = new Worker(URL.createObjectURL(new Blob([`
  5.         // Web Worker代码
  6.         self.onmessage = function(e) {
  7.             var jsonData = e.data.jsonData;
  8.             var rootName = e.data.rootName || "root";
  9.             
  10.             // 转换为XML
  11.             function jsonToXml(jsonObj, rootName) {
  12.                 var xml = '<?xml version="1.0" encoding="UTF-8"?>';
  13.                
  14.                 if (rootName === undefined) {
  15.                     rootName = "root";
  16.                 }
  17.                
  18.                 xml += '<' + rootName + '>';
  19.                
  20.                 function parseValue(value, key) {
  21.                     if (Array.isArray(value)) {
  22.                         for (var i = 0; i < value.length; i++) {
  23.                             xml += '<' + key + '>';
  24.                             parseObject(value[i]);
  25.                             xml += '</' + key + '>';
  26.                         }
  27.                     } else if (typeof value === 'object' && value !== null) {
  28.                         xml += '<' + key + '>';
  29.                         parseObject(value);
  30.                         xml += '</' + key + '>';
  31.                     } else {
  32.                         xml += '<' + key + '>' + value + '</' + key + '>';
  33.                     }
  34.                 }
  35.                
  36.                 function parseObject(obj) {
  37.                     for (var key in obj) {
  38.                         if (obj.hasOwnProperty(key)) {
  39.                             parseValue(obj[key], key);
  40.                         }
  41.                     }
  42.                 }
  43.                
  44.                 parseObject(jsonObj);
  45.                
  46.                 xml += '</' + rootName + '>';
  47.                
  48.                 return xml;
  49.             }
  50.             
  51.             // 转换JSON为XML
  52.             var xmlData = jsonToXml(jsonData, rootName);
  53.             
  54.             // 解析XML
  55.             var parser = new DOMParser();
  56.             var xmlDoc = parser.parseFromString(xmlData, "text/xml");
  57.             
  58.             // 处理数据
  59.             function processXmlData(xmlDoc) {
  60.                 // 这里可以添加自定义的数据处理逻辑
  61.                 var result = {
  62.                     processed: true,
  63.                     nodeCount: xmlDoc.getElementsByTagName("*").length
  64.                 };
  65.                
  66.                 return result;
  67.             }
  68.             
  69.             var result = processXmlData(xmlDoc);
  70.             
  71.             // 发送结果回主线程
  72.             self.postMessage(result);
  73.         };
  74.     `], { type: 'application/javascript' })));
  75.    
  76.     // 接收Worker返回的结果
  77.     worker.onmessage = function(e) {
  78.         callback(e.data);
  79.         worker.terminate();
  80.     };
  81.    
  82.     // 发送数据到Worker
  83.     worker.postMessage({
  84.         jsonData: jsonData,
  85.         rootName: "data"
  86.     });
  87. }
  88. // 示例使用
  89. var largeJsonData = {
  90.     // 大型JSON数据
  91.     items: []
  92. };
  93. // 生成大型JSON数据
  94. for (var i = 0; i < 10000; i++) {
  95.     largeJsonData.items.push({
  96.         id: i,
  97.         name: "Item " + i,
  98.         value: Math.random() * 1000
  99.     });
  100. }
  101. // 异步处理
  102. console.log("开始处理大型JSON数据...");
  103. processLargeJsonAsync(largeJsonData, function(result) {
  104.     console.log("处理完成:", result);
  105. });
复制代码

解决跨平台兼容性挑战

挑战1:不同浏览器的DOM实现差异

不同的浏览器可能对DOM的实现有所不同,这可能导致代码在某些浏览器中无法正常工作。
  1. // 跨浏览器兼容的DOM操作工具
  2. var DOMUtils = {
  3.     // 解析XML
  4.     parseXml: function(xmlString) {
  5.         if (window.DOMParser) {
  6.             // 现代浏览器
  7.             try {
  8.                 var parser = new DOMParser();
  9.                 return parser.parseFromString(xmlString, "text/xml");
  10.             } catch (e) {
  11.                 return null;
  12.             }
  13.         } else if (window.ActiveXObject) {
  14.             // IE旧版
  15.             try {
  16.                 var xmlDoc = new ActiveXObject("Microsoft.XMLDOM");
  17.                 xmlDoc.async = false;
  18.                 xmlDoc.loadXML(xmlString);
  19.                 return xmlDoc;
  20.             } catch (e) {
  21.                 return null;
  22.             }
  23.         } else {
  24.             return null;
  25.         }
  26.     },
  27.    
  28.     // 获取元素文本内容
  29.     getTextContent: function(element) {
  30.         if (!element) return "";
  31.         
  32.         if (typeof element.textContent === "string") {
  33.             return element.textContent;
  34.         } else if (typeof element.innerText === "string") {
  35.             return element.innerText;
  36.         } else {
  37.             return element.text || "";
  38.         }
  39.     },
  40.    
  41.     // 获取元素子节点
  42.     getChildNodes: function(element, tagName) {
  43.         if (!element) return [];
  44.         
  45.         if (element.getElementsByTagName) {
  46.             return element.getElementsByTagName(tagName);
  47.         } else if (element.querySelectorAll) {
  48.             return element.querySelectorAll(tagName);
  49.         } else {
  50.             // 回退方案
  51.             var result = [];
  52.             var children = element.childNodes;
  53.             
  54.             for (var i = 0; i < children.length; i++) {
  55.                 if (children[i].nodeName === tagName) {
  56.                     result.push(children[i]);
  57.                 }
  58.             }
  59.             
  60.             return result;
  61.         }
  62.     },
  63.    
  64.     // 获取元素属性
  65.     getAttribute: function(element, attrName) {
  66.         if (!element) return "";
  67.         
  68.         if (element.getAttribute) {
  69.             return element.getAttribute(attrName) || "";
  70.         } else if (element[attrName]) {
  71.             return element[attrName];
  72.         } else {
  73.             return "";
  74.         }
  75.     },
  76.    
  77.     // XPath查询
  78.     selectNodes: function(xmlDoc, xpath) {
  79.         if (xmlDoc.evaluate) {
  80.             // 现代浏览器
  81.             var nodes = xmlDoc.evaluate(xpath, xmlDoc, null, XPathResult.ANY_TYPE, null);
  82.             var result = [];
  83.             var node = nodes.iterateNext();
  84.             
  85.             while (node) {
  86.                 result.push(node);
  87.                 node = nodes.iterateNext();
  88.             }
  89.             
  90.             return result;
  91.         } else if (xmlDoc.selectNodes) {
  92.             // IE旧版
  93.             return xmlDoc.selectNodes(xpath);
  94.         } else {
  95.             return [];
  96.         }
  97.     }
  98. };
  99. // 使用示例
  100. var xmlString = '<?xml version="1.0" encoding="UTF-8"?><root><item id="1">Test</item></root>';
  101. var xmlDoc = DOMUtils.parseXml(xmlString);
  102. if (xmlDoc) {
  103.     var items = DOMUtils.getChildNodes(xmlDoc, "item");
  104.     for (var i = 0; i < items.length; i++) {
  105.         var id = DOMUtils.getAttribute(items[i], "id");
  106.         var text = DOMUtils.getTextContent(items[i]);
  107.         console.log("Item " + id + ": " + text);
  108.     }
  109.    
  110.     // 使用XPath查询
  111.     var xpathResult = DOMUtils.selectNodes(xmlDoc, "//item");
  112.     console.log("XPath found " + xpathResult.length + " items");
  113. } else {
  114.     console.error("Failed to parse XML");
  115. }
复制代码

挑战2:处理不同平台的字符编码

不同平台可能使用不同的字符编码,这可能导致JSON数据在转换过程中出现乱码。
  1. // 跨平台字符编码处理工具
  2. var EncodingUtils = {
  3.     // 检测文本编码
  4.     detectEncoding: function(text) {
  5.         // 简单的BOM检测
  6.         if (text.charCodeAt(0) === 0xFEFF) {
  7.             return "UTF-16BE";
  8.         } else if (text.charCodeAt(0) === 0xFFFE) {
  9.             return "UTF-16LE";
  10.         } else if (text.charCodeAt(0) === 0xEFBBBF) {
  11.             return "UTF-8";
  12.         }
  13.         
  14.         // 尝试通过内容检测
  15.         var hasHighBytes = false;
  16.         for (var i = 0; i < Math.min(text.length, 1024); i++) {
  17.             if (text.charCodeAt(i) > 127) {
  18.                 hasHighBytes = true;
  19.                 break;
  20.             }
  21.         }
  22.         
  23.         if (!hasHighBytes) {
  24.             return "ASCII";
  25.         }
  26.         
  27.         // 默认返回UTF-8
  28.         return "UTF-8";
  29.     },
  30.    
  31.     // 转换文本编码
  32.     convertEncoding: function(text, fromEncoding, toEncoding) {
  33.         // 在浏览器环境中,通常使用UTF-8,所以这里主要是处理特殊情况
  34.         if (fromEncoding === toEncoding) {
  35.             return text;
  36.         }
  37.         
  38.         // 处理BOM
  39.         if (fromEncoding === "UTF-8" && text.charCodeAt(0) === 0xEFBBBF) {
  40.             text = text.substring(1);
  41.         } else if (fromEncoding === "UTF-16BE" && text.charCodeAt(0) === 0xFEFF) {
  42.             text = text.substring(1);
  43.         } else if (fromEncoding === "UTF-16LE" && text.charCodeAt(0) === 0xFFFE) {
  44.             text = text.substring(1);
  45.         }
  46.         
  47.         // 如果目标编码是UTF-8,添加BOM
  48.         if (toEncoding === "UTF-8") {
  49.             text = "\uEFBBBF" + text;
  50.         } else if (toEncoding === "UTF-16BE") {
  51.             text = "\uFEFF" + text;
  52.         } else if (toEncoding === "UTF-16LE") {
  53.             text = "\uFFFE" + text;
  54.         }
  55.         
  56.         return text;
  57.     },
  58.    
  59.     // 安全地解析JSON
  60.     parseJson: function(jsonString) {
  61.         try {
  62.             // 检测编码
  63.             var encoding = this.detectEncoding(jsonString);
  64.             
  65.             // 转换为UTF-8(如果需要)
  66.             var utf8String = this.convertEncoding(jsonString, encoding, "UTF-8");
  67.             
  68.             // 解析JSON
  69.             return JSON.parse(utf8String);
  70.         } catch (e) {
  71.             console.error("Failed to parse JSON:", e);
  72.             return null;
  73.         }
  74.     },
  75.    
  76.     // 安全地生成XML
  77.     generateXml: function(jsonObj, rootName) {
  78.         try {
  79.             // 转换为XML字符串
  80.             var xmlString = this.jsonToXml(jsonObj, rootName);
  81.             
  82.             // 确保使用UTF-8编码
  83.             return this.convertEncoding(xmlString, "UTF-8", "UTF-8");
  84.         } catch (e) {
  85.             console.error("Failed to generate XML:", e);
  86.             return null;
  87.         }
  88.     },
  89.    
  90.     // JSON转XML
  91.     jsonToXml: function(jsonObj, rootName) {
  92.         var xml = '<?xml version="1.0" encoding="UTF-8"?>';
  93.         
  94.         if (rootName === undefined) {
  95.             rootName = "root";
  96.         }
  97.         
  98.         xml += '<' + rootName + '>';
  99.         
  100.         function parseValue(value, key) {
  101.             if (Array.isArray(value)) {
  102.                 for (var i = 0; i < value.length; i++) {
  103.                     xml += '<' + key + '>';
  104.                     parseObject(value[i]);
  105.                     xml += '</' + key + '>';
  106.                 }
  107.             } else if (typeof value === 'object' && value !== null) {
  108.                 xml += '<' + key + '>';
  109.                 parseObject(value);
  110.                 xml += '</' + key + '>';
  111.             } else {
  112.                 // 转义特殊字符
  113.                 var escapedValue = String(value)
  114.                     .replace(/&/g, '&amp;')
  115.                     .replace(/</g, '&lt;')
  116.                     .replace(/>/g, '&gt;')
  117.                     .replace(/"/g, '&quot;')
  118.                     .replace(/'/g, '&apos;');
  119.                
  120.                 xml += '<' + key + '>' + escapedValue + '</' + key + '>';
  121.             }
  122.         }
  123.         
  124.         function parseObject(obj) {
  125.             for (var key in obj) {
  126.                 if (obj.hasOwnProperty(key)) {
  127.                     parseValue(obj[key], key);
  128.                 }
  129.             }
  130.         }
  131.         
  132.         parseObject(jsonObj);
  133.         
  134.         xml += '</' + rootName + '>';
  135.         
  136.         return xml;
  137.     }
  138. };
  139. // 使用示例
  140. var jsonString = '{"name":"测试","value":123}';
  141. var jsonObj = EncodingUtils.parseJson(jsonString);
  142. if (jsonObj) {
  143.     var xmlString = EncodingUtils.generateXml(jsonObj, "data");
  144.     console.log("Generated XML:", xmlString);
  145.    
  146.     // 使用DOMUtils解析XML
  147.     var xmlDoc = DOMUtils.parseXml(xmlString);
  148.     if (xmlDoc) {
  149.         var nameNodes = DOMUtils.getChildNodes(xmlDoc, "name");
  150.         if (nameNodes.length > 0) {
  151.             var name = DOMUtils.getTextContent(nameNodes[0]);
  152.             console.log("Name:", name);
  153.         }
  154.     }
  155. }
复制代码

挑战3:处理不同平台的数据类型差异

不同平台可能对数据类型的处理有所不同,特别是在处理数字、日期等数据类型时。
  1. // 跨平台数据类型处理工具
  2. var DataTypeUtils = {
  3.     // 检测数据类型
  4.     detectType: function(value) {
  5.         if (value === null) {
  6.             return "null";
  7.         } else if (Array.isArray(value)) {
  8.             return "array";
  9.         } else if (typeof value === "object") {
  10.             // 检查是否为日期
  11.             if (value instanceof Date) {
  12.                 return "date";
  13.             }
  14.             // 检查是否为正则表达式
  15.             if (value instanceof RegExp) {
  16.                 return "regexp";
  17.             }
  18.             return "object";
  19.         } else if (typeof value === "number") {
  20.             // 检查是否为整数
  21.             if (value === Math.floor(value)) {
  22.                 return "integer";
  23.             }
  24.             return "float";
  25.         } else if (typeof value === "boolean") {
  26.             return "boolean";
  27.         } else if (typeof value === "string") {
  28.             // 检查是否为日期字符串
  29.             if (!isNaN(Date.parse(value))) {
  30.                 return "date-string";
  31.             }
  32.             // 检查是否为数字字符串
  33.             if (!isNaN(value) && value.trim() !== "") {
  34.                 return "number-string";
  35.             }
  36.             // 检查是否为布尔字符串
  37.             if (value.toLowerCase() === "true" || value.toLowerCase() === "false") {
  38.                 return "boolean-string";
  39.             }
  40.             return "string";
  41.         } else {
  42.             return "unknown";
  43.         }
  44.     },
  45.    
  46.     // 转换数据类型
  47.     convertType: function(value, targetType) {
  48.         var currentType = this.detectType(value);
  49.         
  50.         if (currentType === targetType) {
  51.             return value;
  52.         }
  53.         
  54.         switch (targetType) {
  55.             case "string":
  56.                 return String(value);
  57.                
  58.             case "number":
  59.             case "float":
  60.                 return parseFloat(value);
  61.                
  62.             case "integer":
  63.                 return parseInt(value, 10);
  64.                
  65.             case "boolean":
  66.                 if (typeof value === "string") {
  67.                     return value.toLowerCase() === "true";
  68.                 }
  69.                 return Boolean(value);
  70.                
  71.             case "date":
  72.                 if (typeof value === "string") {
  73.                     return new Date(value);
  74.                 } else if (typeof value === "number") {
  75.                     return new Date(value);
  76.                 }
  77.                 return null;
  78.                
  79.             case "array":
  80.                 if (currentType === "object" && value !== null) {
  81.                     return Object.keys(value).map(function(key) {
  82.                         return value[key];
  83.                     });
  84.                 }
  85.                 return [value];
  86.                
  87.             case "object":
  88.                 if (currentType === "array") {
  89.                     var obj = {};
  90.                     for (var i = 0; i < value.length; i++) {
  91.                         obj[i] = value[i];
  92.                     }
  93.                     return obj;
  94.                 }
  95.                 return {"value": value};
  96.                
  97.             default:
  98.                 return value;
  99.         }
  100.     },
  101.    
  102.     // 增强的JSON转XML
  103.     jsonToXml: function(jsonObj, rootName) {
  104.         var xml = '<?xml version="1.0" encoding="UTF-8"?>';
  105.         
  106.         if (rootName === undefined) {
  107.             rootName = "root";
  108.         }
  109.         
  110.         xml += '<' + rootName + '>';
  111.         
  112.         function parseValue(value, key) {
  113.             var type = DataTypeUtils.detectType(value);
  114.             
  115.             if (Array.isArray(value)) {
  116.                 for (var i = 0; i < value.length; i++) {
  117.                     xml += '<' + key + ' type="array">';
  118.                     parseObject(value[i]);
  119.                     xml += '</' + key + '>';
  120.                 }
  121.             } else if (typeof value === 'object' && value !== null) {
  122.                 if (type === "date") {
  123.                     xml += '<' + key + ' type="date">' + value.toISOString() + '</' + key + '>';
  124.                 } else {
  125.                     xml += '<' + key + ' type="object">';
  126.                     parseObject(value);
  127.                     xml += '</' + key + '>';
  128.                 }
  129.             } else {
  130.                 // 转义特殊字符
  131.                 var escapedValue = String(value)
  132.                     .replace(/&/g, '&amp;')
  133.                     .replace(/</g, '&lt;')
  134.                     .replace(/>/g, '&gt;')
  135.                     .replace(/"/g, '&quot;')
  136.                     .replace(/'/g, '&apos;');
  137.                
  138.                 xml += '<' + key + ' type="' + type + '">' + escapedValue + '</' + key + '>';
  139.             }
  140.         }
  141.         
  142.         function parseObject(obj) {
  143.             for (var key in obj) {
  144.                 if (obj.hasOwnProperty(key)) {
  145.                     parseValue(obj[key], key);
  146.                 }
  147.             }
  148.         }
  149.         
  150.         parseObject(jsonObj);
  151.         
  152.         xml += '</' + rootName + '>';
  153.         
  154.         return xml;
  155.     },
  156.    
  157.     // 增强的XML转JSON
  158.     xmlToJson: function(xmlDoc) {
  159.         var obj = {};
  160.         
  161.         function parseNode(node) {
  162.             var result = {};
  163.             
  164.             // 处理属性
  165.             if (node.attributes && node.attributes.length > 0) {
  166.                 result["@attributes"] = {};
  167.                 for (var i = 0; i < node.attributes.length; i++) {
  168.                     var attr = node.attributes[i];
  169.                     result["@attributes"][attr.nodeName] = attr.nodeValue;
  170.                 }
  171.             }
  172.             
  173.             // 处理子节点
  174.             if (node.childNodes && node.childNodes.length > 0) {
  175.                 for (var j = 0; j < node.childNodes.length; j++) {
  176.                     var child = node.childNodes[j];
  177.                     
  178.                     if (child.nodeType === 1) { // 元素节点
  179.                         var childName = child.nodeName;
  180.                         var childResult = parseNode(child);
  181.                         
  182.                         if (result[childName] === undefined) {
  183.                             result[childName] = childResult;
  184.                         } else if (Array.isArray(result[childName])) {
  185.                             result[childName].push(childResult);
  186.                         } else {
  187.                             result[childName] = [result[childName], childResult];
  188.                         }
  189.                     } else if (child.nodeType === 3) { // 文本节点
  190.                         var text = child.nodeValue.trim();
  191.                         if (text) {
  192.                             // 根据类型属性转换数据类型
  193.                             var type = node.getAttribute("type") || "string";
  194.                             result = DataTypeUtils.convertType(text, type);
  195.                         }
  196.                     }
  197.                 }
  198.             }
  199.             
  200.             return result;
  201.         }
  202.         
  203.         if (xmlDoc.documentElement) {
  204.             obj = parseNode(xmlDoc.documentElement);
  205.         }
  206.         
  207.         return obj;
  208.     }
  209. };
  210. // 使用示例
  211. var jsonData = {
  212.     name: "测试",
  213.     age: 30,
  214.     salary: 5000.50,
  215.     active: true,
  216.     joinDate: new Date(),
  217.     skills: ["JavaScript", "HTML", "CSS"],
  218.     address: {
  219.         street: "123 Main St",
  220.         city: "Anytown"
  221.     }
  222. };
  223. // 转换为XML
  224. var xmlString = DataTypeUtils.jsonToXml(jsonData, "person");
  225. console.log("Generated XML with type info:", xmlString);
  226. // 解析XML
  227. var xmlDoc = DOMUtils.parseXml(xmlString);
  228. if (xmlDoc) {
  229.     var parsedJson = DataTypeUtils.xmlToJson(xmlDoc);
  230.     console.log("Parsed JSON with preserved types:", parsedJson);
  231.    
  232.     // 验证数据类型
  233.     console.log("joinDate type:", DataTypeUtils.detectType(parsedJson.joinDate));
  234.     console.log("age type:", DataTypeUtils.detectType(parsedJson.age));
  235.     console.log("salary type:", DataTypeUtils.detectType(parsedJson.salary));
  236.     console.log("active type:", DataTypeUtils.detectType(parsedJson.active));
  237. }
复制代码

结论

通过本文的介绍,我们深入探讨了如何使用XML DOM来解析JSON数据,从基础语法到高级应用,以及如何提升数据处理效率和解决跨平台兼容性挑战。

主要内容包括:

1. XML DOM基础:介绍了XML DOM的基本概念、结构和操作方法。
2. JSON数据基础:解释了JSON的基本结构和操作方法。
3. 使用XML DOM解析JSON数据:详细说明了如何将JSON转换为XML,然后使用XML DOM进行解析。
4. 基础应用实例:提供了简单的JSON数据解析和处理JSON数组的实例。
5. 高级应用实例:展示了处理复杂嵌套JSON结构和使用XPath查询JSON数据的高级技术。
6. 提升数据处理效率的技巧:介绍了缓存XML DOM对象、批量处理数据、使用XSLT转换数据和异步处理大型JSON数据的技巧。
7. 解决跨平台兼容性挑战:提供了解决不同浏览器的DOM实现差异、处理不同平台的字符编码和处理不同平台的数据类型差异的方法。

通过掌握这些技术和方法,您可以更有效地处理JSON数据,提高数据处理效率,并解决跨平台兼容性挑战。无论是在Web开发、移动应用开发还是服务器端数据处理中,这些技巧都能帮助您更好地应对各种数据处理的挑战。

希望本文对您有所帮助,祝您在数据处理的道路上取得更大的成功!
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则