【问题标题】:SQL externalisation for Node JS (XML parsing)Node JS 的 SQL 外部化(XML 解析)
【发布时间】:2015-03-18 19:43:03
【问题描述】:

假设我有以下文件:

<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"] 将返回 INSERT INTO products

【问题讨论】:

  • “我找不到可以读取 CDATA 值的包。” 这很难想象。任何 XML 解析器都应该能够处理 CDATA 部分。你试过哪一个?
  • 我试过xml2js,libxmljs。我可以用这些写 CDATA,但找不到读取 CDATA 的方法。
  • xml2js 对我来说很好用。将 example 更改为 var xml = "&lt;root&gt;&lt;![CDATA[Hello xml2js!]]&gt;&lt;/root&gt;"; 就像预期的那样工作。
  • 将 xml 更改为 &lt;roots&gt;&lt;root id="sd"&gt;&lt;![CDATA[Hello xml2js!]]&gt;&lt;/root&gt;&lt;/roots&gt; 将输出:{ roots: { root: [ [Object] ] } }。 Hello xml2js 不会显示,除非 id 被移除。
  • 这只是控制台中的表示,因为 ID 为数据结构添加了额外的嵌套。做console.log(JSON.stringify(result, null, 2));查看完整的结构。

标签: javascript xml node.js parsing


【解决方案1】:

我不知道是否有创建 id -&gt; 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
});

【讨论】:

  • 再次感谢菲利克斯!
  • 不客气!试试看,我可能在某个地方犯了错误,但如果你让我知道,我会更新。我希望这个想法很清楚。
【解决方案2】:
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]._));
});

【讨论】:

  • 例子很好,但解释更好。这根本没有解决 OP 想要一个 id -&gt; content 映射的问题。现在你的答案就是我在以代码表示的 cmets 中所说的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多