我需要处理一个大的KML文件(>3 MiB)。要检查它,我需要对其进行研究,但有太多的 Style 和 StyleMap Node ,手动浏览变得不可能。我决定使用 Node.js 以编程方式删除不必要的 Node 。使用 Node.js 解析 XML 文件相当容易,例如使用 sax或xmldom 。但棘手的部分似乎是如何排除某些 Node 及其子 Node 并保留所有其他 Node 。对于sax来说,这变成了一项相当复杂的任务,因为输出是XML,因此必须处理所有保留的 Node 、它们的属性和子 Node 。我觉得应该有一个更简单、更强大的解决方案。有什么建议和代码片段吗?
最佳答案
一种方法是使用xmldom和 xpath 。首先,使用 xpath 和 XPath 表达式获取要删除的 Node 。它返回可以从 DOM 树中删除的 xmldom Node 数组。例如,删除所有 book
Node :
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>
关于javascript - 如何使用 Node.js 过滤掉 XML Node ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46626021/