2017-10-07 66 views
0

我需要處理一個大的KML文件(> 3 MiBs)。爲了檢查它,我需要研究它,但是有很多Style和StyleMap節點,使得手動瀏覽變得不可能。我決定用Node.js編程刪除不必要的節點。使用Node.js解析XML文件相當容易,例如使用saxxmldom。但棘手的部分似乎是如何排除某些節點和他們的孩子,並保留所有其他節點。由於輸出是XML,所以所有保留的節點,它們的屬性和子節點都必須被處理,因此它變成一個相當複雜的任務sax。我覺得應該有一個更簡單,更強大的解決方案。任何建議和代碼片段?如何用Node.js過濾掉XML節點?

+2

上搜索NPM任何XML解析器包,包括它,看了你的文件,刪除某些節點,保存到文件就萬事大吉了。你到底在問什麼? – xDreamCoding

+0

@xDreamCoding謝謝,我一直在尋找一個通用的方法,你簡要描述了一下,並且有一個代碼片斷。尤其是節點應該如何移除的部分。我編輯了更具體的問題。我發現[xpath](https://www.npmjs.com/package/xpath)可能能夠做到這一點。如果它運行良好,我想我會爲此實現一個npm模塊。 –

+0

您想要轉換XML文件。 XSLT是你的朋友。 – Tomalak

回答

0

一種方法是使用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>