2017-10-07 1 views
0

KML 파일 (> 3 MiBs)을 처리해야합니다. 이를 조사하기 위해서는 살펴볼 필요가 있지만 수동 탐색이 불가능 해지는 Style과 StyleMap 노드가 너무 많습니다. Node.js를 사용하여 불필요한 노드를 프로그래밍 방식으로 제거하기로 결정했습니다. 예를 들어 sax 또는 xmldom을 사용하여 Node.js로 XML 파일을 구문 분석하는 것은 다소 쉽습니다. 그러나 까다로운 부분은 특정 노드와 그 자식을 제외하고 다른 모든 노드를 유지하는 방법 인 것 같습니다. sax 출력은 XML이므로 모든 보관 된 노드, 해당 특성 및 하위를 처리해야하므로 다소 복잡한 작업이됩니다. 더 간단하고 강력한 솔루션이 있어야한다고 생각합니다. 어떤 제안과 코드 조각?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> 
관련 문제