JavaScript的XML解析器

16
我正在寻找一款用于解析XML数据的优秀JavaScript库。它应该比浏览器内置的XML DOM解析器更易于使用。
我有点被使用JSON宠坏了,期待着能够找到类似的用于XML的工具。
4个回答

48

免责声明:我是开源Jsonix库的作者,该库也许适合这项任务。


几年前,我也在寻找一个适用于 JavaScript 的好的 XML<->JSON 解析/序列化库。我需要处理符合相当复杂的 XML Schema 标准的 XML 文档。在 Java 中,我经常使用JAXB处理此任务,所以我正在寻找类似的东西:

是否有一种 JavaScript API 可以用于 XML 绑定 - 类似于 Java 的 JAXB?

那时我未能找到这样的工具。

因此,我编写了Jsonix,我认为它是 JavaScript 的 JAXB 类似物。

如果您对以下功能感兴趣,可以考虑使用Jsonix

  • XML<->JSON 转换基于 XML 和 JSON 结构之间的声明性映射
  • 可以从 XML Schema自动生成映射或手动编写
  • 双向 - 支持解析和序列化(或其他术语中的取消标记/标记)。
  • 支持 XML 文档中定义的元素属性以及考虑命名空间
  • 严格类型化。
  • 严格结构化。
  • 支持几乎所有XML Schema 内置类型(包括特殊类型如QName)。
  • 适用于浏览器以及Node.js,也兼容RequireJS/AMD(也适用于 Node.js 中的amdefine
  • 广泛的文档

但是,如果您的 XML 相对简单,没有 XML Schema 或者您不关心严格类型或结构,那么Jsonix 可能过于复杂。请检查您的要求。

示例

JSFiddle中尝试它。

您可以使用以下命令采用采购订单模式并为其生成映射:

java -jar node_modules/jsonix/lib/jsonix-schema-compiler-full.jar
  -d mappings -p PO purchaseorder.xsd
你会得到一个描述 XML 和 JavaScript 结构之间映射关系的 PO.js 文件。以下是此映射文件的一部分,以便让您了解:
var PO = {
    name: 'PO',
    typeInfos: [{
        localName: 'PurchaseOrderType',
        propertyInfos: [{
            name: 'shipTo',
            typeInfo: 'PO.USAddress'
        }, {
            name: 'billTo',
            typeInfo: 'PO.USAddress'
        }, {
            name: 'comment'
        }, {
            name: 'orderDate',
            typeInfo: 'Calendar',
            type: 'attribute'
        }, ...]
    }, {
        localName: 'USAddress',
        propertyInfos: [ ... ]
    }, ...],
    elementInfos: [{
        elementName: 'purchaseOrder',
        typeInfo: 'PO.PurchaseOrderType'
    }, ... ]
};

有了这个映射文件,你可以解析XML文件:

// First we construct a Jsonix context - a factory for unmarshaller (parser)
// and marshaller (serializer)
var context = new Jsonix.Context([PO]);

// Then we create a unmarshaller
var unmarshaller = context.createUnmarshaller();

// Unmarshal an object from the XML retrieved from the URL
unmarshaller.unmarshalURL('po.xml',
    // This callback function will be provided
    // with the result of the unmarshalling
    function (unmarshalled) {
        // Alice Smith
        console.log(unmarshalled.value.shipTo.name);
        // Baby Monitor
        console.log(unmarshalled.value.items.item[1].productName);
    });

或将您的JavaScript对象序列化为XML:

// Create a marshaller
var marshaller = context.createMarshaller();

// Marshal a JavaScript Object as XML (DOM Document)
var doc = marshaller.marshalDocument({
    name: {
        localPart: "purchaseOrder"
    },
    value: {
        orderDate: { year: 1999, month: 10, day: 20 },
        shipTo: {
            country: "US",
            name: "Alice Smith",
            street: "123 Maple Street",
            city: "Mill Valley",
            state: "CA",
            zip: 90952
        },
        billTo: { /* ... */ },
        comment: 'Hurry, my lawn is going wild!',
        items: { /* ... */ }
    }
});

您可以在JSFiddle中尝试它,看看它在实践中的运作方式。


额外免责声明:这个答案之所以受到高票支持,是因为在 Meta 讨论中。请注意“元效应”。这里的高票并不一定意味着Jsonix很好、适用或被社区推荐。请不要被高票误导。


6
我使用 jQuery 实现这个功能。下面是一个很好的例子:
(编辑:注意 - 以下博客似乎已经消失了。) http://blog.reindel.com/2007/09/24/jquery-and-xml-revisited/jQuery 文档中也有很多好的例子: http://www.webmonkey.com/tutorial/Easy_XML_Consumption_using_jQuery?oldid=20032 编辑:由于我的主要示例博客已经消失,我想添加另一个示例,该示例显示了基础知识并帮助处理命名空间问题: http://www.zachleat.com/web/selecting-xml-with-javascript/

Reindel链接已被劫持。 - DuckMaestro
1
这是博客的镜像:http://web.archive.org/web/20080110113712/http://blog.reindel.com/2007/09/24/jquery-and-xml-revisited/。 - brasofilo
也许你可以将博客文章的打印稿作为PDF附件包含在答案中?我会删掉“编辑”备注,因为它们会使文本变得不够清晰。我只会删除失效链接并用有效链接替换它们。 - Jonathan Benn
这个梗源是从这里开始的吗? - Peter Mortensen

2

1

你尝试过XML for SCRIPT吗?我必须承认,我个人从未使用过它,但我听说/读到了一些好的东西。

试试看,也许在这里分享你的经验?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接