JavaScript的XML解析器

Gul*_*zim 16 javascript xml browser parsing json

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

我在使用JSON时遇到了一些麻烦,我期待着类似于XML的东西.

lex*_*ore 48

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


几年前,我还在为JavaScript寻找一个好的XML < - > JSON解析/序列化库.我需要处理符合相当复杂的XML Schema的XML文档.在Java中,我经常使用JAXB来完成任务,所以我一直在寻找类似的东西:

是否有用于XML绑定的JavaScript API - 类似于JAXB for Java?

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

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

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

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

但是,如果您的XML相当简单,没有XML Schema,或者您对严格的类型或结构不感兴趣,那么Jsonix 可能会有些过分.检查您的要求.

在JSFiddle中尝试一下.

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

java -jar node_modules/jsonix/lib/jsonix-schema-compiler-full.jar
  -d mappings -p PO purchaseorder.xsd
Run Code Online (Sandbox Code Playgroud)

您将获得一个PO.js描述XML和JavaScript结构之间映射的文件.以下是此映射文件的片段,可为您提供一个印象:

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'
    }, ... ]
};
Run Code Online (Sandbox Code Playgroud)

有了这个映射文件,你可以解析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);
    });
Run Code Online (Sandbox Code Playgroud)

或者将您的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: { /* ... */ }
    }
});
Run Code Online (Sandbox Code Playgroud)

您可以在JSFiddle中尝试它,看看它在实践中是如何工作的.


附加免责声明:由于以下关于meta的讨论,这个答案被高度评价.所以请注意"元效应".这里的高票并不一定意味着Jsonix是好的,适用的或社区推荐的.不要被高票批评误导.


sha*_*dit 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/