JavaScript的XML解析器

JavaScript的XML解析器

XML parser for JavaScript

我正在寻找一个很好的JavaScript库来解析XML数据。 它应该比与浏览器捆绑在一起的内置XML DOM解析器容易使用。

我对使用JSON有点兴趣,并期待在XML的类似方面有所发展。


免责声明:如果开源Jsonix库可能适合该任务,我就是作者。

几年前,我还在寻找JavaScript的良好XML <-> JSON解析/序列化库。我需要处理符合相当复杂的XML模式的XML文档。在Java中,我通常使用JAXB来完成任务,因此我正在寻找类似的东西:

Is there a JavaScript API for XML binding - analog to JAXB for Java?

那时我找不到这样的工具。

所以我写了Jsonix,我认为它是JavaScript的JAXB模拟。

如果您对以下功能感兴趣,您可能会发现Jsonix是合适的:

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

但是,如果您的XML很简单,没有XML Schema或您对严格的类型或结构不感兴趣,那么Jsonix可能是一个过大的选择。检查您的要求。

在JSFiddle中尝试一下。

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

1
2
java -jar node_modules/jsonix/lib/jsonix-schema-compiler-full.jar
  -d mappings -p PO purchaseorder.xsd

您将获得一个PO.js文件,该文件描述了XML和JavaScript结构之间的映射。这是此映射文件中的一个片段,给您印象:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 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:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 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是良好的,适用于社区的或由社区推荐的。不要被高票误导。


我为此使用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/


如果您的XML是简单格式,则可以查看jQuery和XML to JSON插件或xmlObjectifier。

对于直接解析器,您可能需要查看XML。


您是否尝试过将XML用于SCRIPT。我不得不承认,我从未亲自使用过它,但是我已经听说过/阅读了一些有关它的好东西。

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


推荐阅读