javascript - 如何使用 Node.js 过滤掉 XML Node ?

标签 javascript node.js xml xml-parsing

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

最佳答案

一种方法是使用xmldomxpath 。首先,使用 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/

相关文章:

javascript - 如何在 JavaScript 中访问多维对象数组?

javascript - 使用循环的 Node js 和 ejs

java - 是否可以调用服务而不将其包装在转换中?有人用Java成功实现过吗?

javascript - 在 OpenLayers 中拥有多边形的 removeLastPoint() 函数

javascript - NodeJS - 如何创建一个在命令之后运行的命令?

javascript - Meteor 函数在所有 .js 项目文件中定义

javascript - 正则表达式允许一个句子中的多个工作

javascript - 如何使用分配给变量的字符串作为对象键

xml - 简单 XML 上每个循环的 XSLT

php simple xml 如何读取具有不同子节点级别的多个节点