【问题标题】:How to filter out XML nodes with Node.js?如何使用 Node.js 过滤掉 XML 节点?
【发布时间】:2017-10-07 23:16:59
【问题描述】:

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

【问题讨论】:

  • 在 npm 上搜索任何 xml-parser 包,包含它,读取文件,删除某些节点,保存到文件,然后瞧。你到底在问什么?
  • @xDreamCoding 谢谢,我正在寻找您简要描述的通用方法和代码 sn-p。特别是应该如何删除节点的部分。我将问题编辑为更具体。我发现xpath 可能能够做到这一点。如果它运行良好,我想我会为此实现一个 npm 模块。
  • 您想要转换 XML 文件。 XSLT 是您的朋友。
  • 你可以用camaro选择你想要的节点
  • @AnhThangBui 感谢您的提示。但是,问题有点不同。我事先不知道所有节点和道具,因为我尝试处理的文件太大以至于我无法检查它。我只想删除匹配的节点并保留所有其余的,无论它们的名称、道具或孩子。

标签: javascript node.js xml xml-parsing


【解决方案1】:

一种方法是使用xmldomxpath。首先,使用 xpath 和 XPath 表达式获取要删除的节点。它返回可以从 DOM 树中删除的 xmldom 节点数组。例如删除所有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>

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2019-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多