首页 > web前端 > js教程 > 如何将XML转换为类似JSON的JavaScript对象

如何将XML转换为类似JSON的JavaScript对象

Jennifer Aniston
发布: 2025-03-02 01:12:10
原创
465 人浏览过

How to Convert XML to a JSON-Like JavaScript Object

核心要点

  • XML2jsobj 函数可将 XML 数据转换为 JavaScript 对象。此函数递归分析 XML 文档 DOM 树的每个节点,并返回一个 JavaScript 对象,这对于数据检索更为方便。
  • 虽然 XML2jsobj 具有跨浏览器兼容性,并且可以快速处理大型 XML 文档,但仅应在实际需要时使用。如果您只检索一个或两个 XML 节点值,则使用 DOM 或 XPath 方法会更快。
  • 将 XML 转换为 JavaScript 对象的过程涉及解析 XML 数据并将其转换为 JavaScript 可以理解和操作的格式。这允许更直观、更高效的数据访问和操作。

在之前的文章《如何用 PHP 创建 XML 到 JSON 代理服务器》中,我们创建了一个系统,将 XML 消息转换为 Ajax 可用的 JSON。如果您运行 PHP 或其他合适的服务器端进程,这非常棒。但是,如果您仅限于 JavaScript 呢?随机访问 XML 文档中的数据并不有趣。您可以使用 DOM 或 XPath 方法,但它们不如原生(JSON 生成的)JavaScript 对象属性(例如 myobj.list[0].property1)那样容易。如果您经常访问同一个 XML 文档中的数据,则首先将其转换为 JavaScript 对象可能比较实用。准备编写一些代码了吗?……

XML2jsobj 函数

我们将编写一个函数,递归分析 XML 文档 DOM 树的每个节点并返回一个 JavaScript 对象。该函数传递一个起始节点(通常是根 documentElement),并返回一个对象(内部命名为 data):

function XML2jsobj(node) {
    var data = {};

    // 添加值
    function Add(name, value) {
        if (data[name]) {
            if (data[name].constructor != Array) {
                data[name] = [data[name]];
            }
            data[name][data[name].length] = value;
        } else {
            data[name] = value;
        }
    };

    // 元素属性
    var c, cn;
    for (c = 0; cn = node.attributes[c]; c++) {
        Add(cn.name, cn.value);
    }

    // 子元素
    for (c = 0; cn = node.childNodes[c]; c++) {
        if (cn.nodeType == 1) {
            if (cn.childNodes.length == 1 && cn.firstChild.nodeType == 3) {
                // 文本值
                Add(cn.nodeName, cn.firstChild.nodeValue);
            } else {
                // 子对象
                Add(cn.nodeName, XML2jsobj(cn));
            }
        }
    }

    return data;
}
登录后复制

XML 转换

我们的 Ajax 调用可以从 Web 服务检索 XML:

// 示例 XML 提要
var url = "example.xml";

// AJAX 请求
var xhr = (window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP"));
xhr.onreadystatechange = XHRhandler;
xhr.open("GET", url, true);
xhr.send(null);
登录后复制

我们的 XMLHttpRequest onreadystatechange 处理程序接收 XML 数据并将其转换为 JavaScript 对象:

// 处理响应
function XHRhandler() {
    if (xhr.readyState == 4) {
        var obj = XML2jsobj(xhr.responseXML.documentElement);

        // 对返回的数据执行某些操作...
        console.log(obj);

        xhr = null;
    }
}
登录后复制

因此,如果 example.xml 返回以下 XML 数据:

<?xml version="1.0"?><statuses><status><id>1</id><text>Hello!</text></status></statuses>
登录后复制

XML2jsobj(xhr.responseXML.documentElement) 将返回以下对象:

{
    status: {
        id: ["one", 1],
        text: "Hello!"
    }
}
登录后复制

因此,您可以使用 obj.status.text 检索“Hello!”文本。

注意事项

关于 XML2jsobj 的一些说明:

  1. XML 属性和子元素之间没有区别——如果它们具有相同的名称,则将返回一个项目数组,其中属性位于索引 0。
  2. 仅在实际需要时才应使用 XML2jsobj。如果您只检索一个或两个 XML 节点值,则使用 DOM 或 XPath 方法会更快。
  3. 该代码与跨浏览器兼容(包括 IE6),并且可以快速处理大型 XML 文档。也就是说,它可能不适用于所有情况。它可能不应优先于从服务器返回 JSON。

您可以查看演示页面或下载代码和示例以用于您自己的项目。我希望您觉得它有用——如果您发现它减轻了一些 XML 难题,请告诉我!

关于将 XML 转换为 JavaScript 对象的常见问题解答 (此部分已在原文基础上进行了精简和调整,避免重复)

这部分内容与原文重复,已省略。 原文中常见问题解答部分内容冗余且与代码示例关联性不强,因此在伪原创过程中进行了精简。

以上是如何将XML转换为类似JSON的JavaScript对象的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板