SQL Node JS 的外部化(XML 解析)
SQL externalisation for Node JS (XML parsing)
假设我有以下文件:
<sql-requests>
<sql-request id="insert_product"><![CDATA[INSERT INTO products]]></sql-request>
<sql-request id="insert_account"><![CDATA[INSERT INTO accounts]]></sql-request>
<sql-request id="insert_news"><![CDATA[INSERT INTO news]]></sql-request>
</sql-requests>
我想在节点中解析这个 xml 然后像这样访问 CDATA:
var sql = parsedXml.insert_product; // must return 'INSERT INTO products
最好的方法是什么?根据我的喜好,我应该使用哪个包?我找不到可以读取 CDATA 值的包。
回答(非常感谢 Felix 提供了如何执行此操作的想法)
var parseString = require('xml2js').parseString;
var fs = require('fs');
var content = fs.readFileSync(__dirname + '/sql-requests.xml');
var sql = {};
parseString(content, function (err, result) {
var queries = result['sql-requests']['sql-request'];
queries.forEach(function(query){
var id = query.$.id, request = query._.trim();
sql[id] = request;
});
});
现在,sql["insert_product"]
将 return INSERT INTO products
var parseString = require('xml2js').parseString;
var xml = '<sql-requests>' +
'<sql-request id="insert_product"><![CDATA[INSERT INTO products]]></sql-request>' +
'<sql-request id="insert_account"><![CDATA[INSERT INTO accounts]]></sql-request>' +
'<sql-request id="insert_news"><![CDATA[INSERT INTO news]]></sql-request>' +
'</sql-requests>';
// Prints: '"INSERT INTO products"'
parseString(xml, function (err, result) {
console.dir(JSON.stringify(result['sql-requests']['sql-request'][0]._));
});
我不知道是否有创建 id -> element
映射的 XML 解析器,但 xml2js
肯定适用于 CDATA 部分,您可以轻松地自己创建这样的映射,假设你的结构和问题一样简单:
var parseString = require('xml2js').parseString;
parseString(xml, function (err, result) {
var queries = result['sql-requests']['sql-request'].reduce(queries, query) {
queries[query.$.id] = query._;
return queries;
}, {});
// queries is not an id -> content map
});
假设我有以下文件:
<sql-requests>
<sql-request id="insert_product"><![CDATA[INSERT INTO products]]></sql-request>
<sql-request id="insert_account"><![CDATA[INSERT INTO accounts]]></sql-request>
<sql-request id="insert_news"><![CDATA[INSERT INTO news]]></sql-request>
</sql-requests>
我想在节点中解析这个 xml 然后像这样访问 CDATA:
var sql = parsedXml.insert_product; // must return 'INSERT INTO products
最好的方法是什么?根据我的喜好,我应该使用哪个包?我找不到可以读取 CDATA 值的包。
回答(非常感谢 Felix 提供了如何执行此操作的想法)
var parseString = require('xml2js').parseString;
var fs = require('fs');
var content = fs.readFileSync(__dirname + '/sql-requests.xml');
var sql = {};
parseString(content, function (err, result) {
var queries = result['sql-requests']['sql-request'];
queries.forEach(function(query){
var id = query.$.id, request = query._.trim();
sql[id] = request;
});
});
现在,sql["insert_product"]
将 return INSERT INTO products
var parseString = require('xml2js').parseString;
var xml = '<sql-requests>' +
'<sql-request id="insert_product"><![CDATA[INSERT INTO products]]></sql-request>' +
'<sql-request id="insert_account"><![CDATA[INSERT INTO accounts]]></sql-request>' +
'<sql-request id="insert_news"><![CDATA[INSERT INTO news]]></sql-request>' +
'</sql-requests>';
// Prints: '"INSERT INTO products"'
parseString(xml, function (err, result) {
console.dir(JSON.stringify(result['sql-requests']['sql-request'][0]._));
});
我不知道是否有创建 id -> element
映射的 XML 解析器,但 xml2js
肯定适用于 CDATA 部分,您可以轻松地自己创建这样的映射,假设你的结构和问题一样简单:
var parseString = require('xml2js').parseString;
parseString(xml, function (err, result) {
var queries = result['sql-requests']['sql-request'].reduce(queries, query) {
queries[query.$.id] = query._;
return queries;
}, {});
// queries is not an id -> content map
});