【发布时间】:2010-11-17 02:20:42
【问题描述】:
我正在寻找一个可以解析 XML 字符串并将其转换为 JavaScript 对象的 JavaScript 库。有哪些好的?
【问题讨论】:
标签: javascript xml json
我正在寻找一个可以解析 XML 字符串并将其转换为 JavaScript 对象的 JavaScript 库。有哪些好的?
【问题讨论】:
标签: javascript xml json
以下函数解析 XML 并返回一个带有与 XML 对应的方案的 JavaScript 对象。具有相同名称的 XML 同级被折叠成数组。可以在arrayTags 参数(标签名称字符串数组)中找到名称的节点即使在仅出现一个标签的情况下也总是产生数组。 arrayTags 可以省略。丢弃只有空格的文本节点。
function parseXml(xml, arrayTags) {
let dom = null;
if (window.DOMParser) dom = (new DOMParser()).parseFromString(xml, "text/xml");
else if (window.ActiveXObject) {
dom = new ActiveXObject('Microsoft.XMLDOM');
dom.async = false;
if (!dom.loadXML(xml)) throw dom.parseError.reason + " " + dom.parseError.srcText;
}
else throw new Error("cannot parse xml string!");
function parseNode(xmlNode, result) {
if (xmlNode.nodeName == "#text") {
let v = xmlNode.nodeValue;
if (v.trim()) result['#text'] = v;
return;
}
let jsonNode = {},
existing = result[xmlNode.nodeName];
if (existing) {
if (!Array.isArray(existing)) result[xmlNode.nodeName] = [existing, jsonNode];
else result[xmlNode.nodeName].push(jsonNode);
}
else {
if (arrayTags && arrayTags.indexOf(xmlNode.nodeName) != -1) result[xmlNode.nodeName] = [jsonNode];
else result[xmlNode.nodeName] = jsonNode;
}
if (xmlNode.attributes) for (let attribute of xmlNode.attributes) jsonNode[attribute.nodeName] = attribute.nodeValue;
for (let node of xmlNode.childNodes) parseNode(node, jsonNode);
}
let result = {};
for (let node of dom.childNodes) parseNode(node, result);
return result;
}
【讨论】:
这是一个不错的 xml2json 和 json2xml 转换器:
这是另一个:
根据您的需要,您也许可以使用标准解析器(请参阅http://www.w3schools.com/XML/tryit.asp?filename=tryxml_parsertest2)和 xpath (http://www.w3schools.com/xpath/default.asp) - 这是一个示例:
还有一些不错的教程:
【讨论】:
直奔主题(使用node-xml2json):
npm install xml2json
然后,使用它:
const parser = require('xml2json');
const obj = parser.toJson(xml, { object: true });
const parser = require('xml2json');
const xml = '<root><person><name>Bob Dylan</name></person></root>';
const obj = parser.toJson(xml, { object: true });
const { person } = obj.root;
person.name; // Bob Dylan
您还可以从 JSON 转换为 XML,以及 much more。
【讨论】:
我想要一个简单的 Typescript 版本,它不会创建额外的 #text 对象,也不会忽略属性。如果这是你需要的,这里是代码:
export class DomFuncs {
static parseNode = (node: Node) => {
const childNodes = node.childNodes;
if (childNodes.length === 0) {
return node.nodeValue;
} else if (childNodes.length === 1 && childNodes[0].nodeType === Node.TEXT_NODE) {
return childNodes[0].nodeValue;
} else {
const obj = {};
childNodes.forEach(childNode => {
const childName = childNode.nodeName;
const childValue = obj[childName];
if (childValue !== undefined) {
if (Array.isArray(childValue)) {
childValue.push(DomFuncs.parseNode(childNode));
} else {
obj[childName] = [childValue, DomFuncs.parseNode(childNode)];
}
} else {
obj[childName] = DomFuncs.parseNode(childNode);
}
});
return obj;
}
};
static xml2obj = (str: string) => {
const dom = (new DOMParser()).parseFromString(str, 'text/xml')
const result = {[dom.nodeName]: DomFuncs.parseNode(dom)};
return result;
}
}
使用它:
DomFuncs.xml2obj(xmlString);
此脚本当前忽略 XML 属性,因为我转换的对象不需要它们。如果您需要,请告诉我,我可以更新代码。
【讨论】:
来自https://bitbucket.org/surenrao/xml2json 的 xml2json javascript 文件就是您执行此操作所需的全部内容。
这里是快速下载的下载链接:https://bitbucket.org/surenrao/xml2json/get/0e0989dfe48e.zip
一旦包含在您的项目中,这里有一些示例代码可以帮助您入门:
var xmlStr = "<root><person><name>Bob Dylan</name></person></root>";
var jsObj = X2J.parseXml(xmlStr);
var result = jsObj[0].root[0].person[0].name[0].jValue; //Bob Dylan
【讨论】: