2011-02-28 7 views
3

약 1000 개 이상의 bookinfo 노드로이 XML을 가지고 있다고 가정 해 보겠습니다.JS에서이 XML을 구문 분석하는 가장 빠른 방법

<results> 
    <books> 
    <bookinfo> 
     <name>1</dbname> 
    </bookinfo> 
    <bookinfo> 
    <name>2</dbname> 
    </bookinfo> 
    <bookinfo> 
    <name>3</dbname> 
    </bookinfo> 
</books> 
</results> 
나는 현재 각 책의 이름을 얻기 위해이 사용하고

:

var books = this.req.responseXML.getElementsByTagName("books")[0].getElementsByTagName("bookinfo") 

그런 다음 각 책의 이름으로 뭔가를 루프를 사용 : 나는 '

var bookName = books[i].getElementsByTagName("name")[0].firstChild.nodeValue; 

을 책이 정말 크면 정말 느리다. 불행히도 결과 집합을 제한하거나 다른 반환 유형을 지정할 방법이 없습니다.

더 빠른 방법이 있습니까?

+0

'getElementsByTagName' 호출을 변수/배열로 저장할 수 있으므로 한번만 호출됩니다. –

+0

100 개의 XML 노드는 ** 무 **입니다. 한 번에 두 권 이상의 책을 어떻게 읽는 지 보여주십시오. –

+0

실제로는 1000+와 비슷하며 샘플 XML 출력에서 ​​제시 한 것보다 훨씬 많은 데이터가 있습니다. – doremi

답변

5

아마도 XMLHttpRequest를 사용하고 있습니다.이 경우 응답 XML의 메소드를 호출하기 전에 XML이 구문 분석됩니다 (예 : XML이 이미 파싱되어 DOM으로 바뀜). 더 빠른 파서를 원한다면 현재 UA를위한 다른 사용자 에이전트 또는 다른 자바 스크립트 엔진이 필요할 것입니다. 당신은 XML 문서의 콘텐츠에 액세스 할 수있는 빠른 방법을 원한다면

, 고려의 XPath :

Mozilla documentation

MSDN documentation

나는에 134킬로바이트 로컬 파일에 (같은 //parentNode/node/text()) XPath 식을 사용 439 요소의 텍스트 노드를 추출하여 배열에 넣습니다 (내 표준 evalXPath() 함수와 동일하므로). 그런 다음 해당 배열을 반복하여 각 텍스트 노드의 nodeValue를 다른 배열에 넣고 두 개의 정규식을 사용하여 형식을 지정하여 호출을 바꿉니다 텍스트가 표시되면 alert()이 화면에 join('\n')으로 표시됩니다. 3ms가 걸렸습니다.

529 개의 노드가있는 487KB 파일은 4ms를 소비했습니다 (IE 6은 15ms를보고했지만 시계는 해상도가 매우 낮습니다). 물론 내 네트워크 대기 시간은 거의 제로이지만 XML 파서, XPath 평가자 및 스크립트가 일반적으로 크기 파일을 신속하게 처리 할 수 ​​있음을 보여줍니다.

0

fast xml parser을 사용해 XML 데이터를 JS에서 구현되고 정규식만을 기반으로하는 JSON으로 변환 할 수 있습니다. 다음은 다른 파서에 대한 benchmark입니다. 당신이 NPM 라이브러리를 사용하지 않으려면

var fastXmlParser = require('fast-xml-parser'); 
var jsonObj = fastXmlParser.parse(xmlData); 

// when a tag has attributes 
var options = { 
     attrPrefix : "@_", 
     textNodeName : "#text", 
     ignoreNonTextNodeAttr : true, 
     ignoreTextNodeAttr : true, 
     ignoreNameSpace : true 
    }; 
var jsonObj = fastXmlParser.parse(xmlData,options); 

//Intermediate obj 
var tObj = fastXmlParser.getTraversalObj(xmlData,options); 
var jsonObj = fastXmlParser.convertToJson(tObj); 

, 당신은 직접 HTML에서 parser.js을 포함 할 수 있습니다.

관련 문제