我正在寻找一款用于解析XML数据的优秀JavaScript库。它应该比浏览器内置的XML DOM解析器更易于使用。
我有点被使用JSON宠坏了,期待着能够找到类似的用于XML的工具。
我有点被使用JSON宠坏了,期待着能够找到类似的用于XML的工具。
免责声明:我是开源Jsonix库的作者,该库也许适合这项任务。
几年前,我也在寻找一个适用于 JavaScript 的好的 XML<->JSON 解析/序列化库。我需要处理符合相当复杂的 XML Schema 标准的 XML 文档。在 Java 中,我经常使用JAXB处理此任务,所以我正在寻找类似的东西:
那时我未能找到这样的工具。
因此,我编写了Jsonix,我认为它是 JavaScript 的 JAXB 类似物。
如果您对以下功能感兴趣,可以考虑使用Jsonix:
QName
)。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很好、适用或被社区推荐。请不要被高票误导。