如何使用Node.js过滤出XML节点?

时间:2017-10-07 23:16:59

标签: javascript node.js xml xml-parsing

我需要处理一个大KML个文件(> 3个MiB)。要检查它,我需要调查它,但有很多Style和StyleMap节点,手动浏览变得不可能。我决定用Node.js以编程方式删除不必要的节点。使用Node {js解析XML文件相当容易,例如使用saxxmldom。但棘手的部分似乎是如何排除某些节点及其子节点并保留其他所有节点。使用 sax 会变得相当复杂,因为输出是XML所以必须处理所有保留的节点,它们的属性和子节点。我觉得应该有一个更简单,更强大的解决方案。有什么建议和代码片段吗?

1 个答案:

答案 0 :(得分:0)

一种方法是使用xmldomxpath。首先,使用xpath和XPath表达式获取要删除的节点。它返回一个xmldom节点数组,可以从DOM树中删除。例如,删除所有book个节点:

var xmldom = require('xmldom');
var xpath = require('xpath');

var parser = new xmldom.DOMParser();
var serializer = new xmldom.XMLSerializer();

var xmlIn = '<bookstore>' +
    '<book>Animal Farm</book>' +
    '<book>Nineteen Eighty-Four</book>' +
    '<essay>Reflections on Writing</essay>' +
  '</bookstore>';

var root = parser.parseFromString(xmlIn, 'text/xml');

var nodes = xpath.select('//book', root);

nodes.forEach(function (n) {
  n.parentNode.removeChild(n);
});

var xmlOut = serializer.serializeToString(root);

但是,处理命名空间,多个XPath表达式和缩进保存是一件很困难的事情。因此,我创建了一个 NPM模块 filterxml来提升权重。

var filterxml = require('filterxml')
var patterns = ['//book'];
var namespaces = {};
filterxml(xmlIn, patterns, namespaces, function (err, xmlOut) {
  console.log(xmlOut);
});

将输出:

<bookstore><essay>Reflections on Writing</essay></bookstore>