我正在寻找一个很好的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。我不得不承认,我从未亲自使用过它,但是我已经听说过/阅读了一些有关它的好东西。
试试看,也许在这里分享您的经验?