【发布时间】: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 = "<root><![CDATA[Hello xml2js!]]></root>";就像预期的那样工作。 -
将 xml 更改为
<roots><root id="sd"><![CDATA[Hello xml2js!]]></root></roots>将输出:{ roots: { root: [ [Object] ] } }。 Hello xml2js 不会显示,除非 id 被移除。 -
这只是控制台中的表示,因为 ID 为数据结构添加了额外的嵌套。做
console.log(JSON.stringify(result, null, 2));查看完整的结构。
标签: javascript xml node.js parsing