2017-03-23 1 views
0

다음 구조의 파일이 있습니다. XML이 아니지만 어떻게 든 JSON을 만들어야합니다.XML과 유사한 구조로 파일을 구문 분석하려면 어떻게합니까? 콘텐츠 옆에 자체 닫기 태그가있는 경우 (콘텐츠 대신)

그래서 I는 다음과 같이 할 파일을 기대하면서 :

<chapter> 
<line /> Some text which I want to grab. 
<line /> Some more text which I want to grab. 
<line /> Even more text which I want to grab. 
</chapter> 

각 장의 그래서 '라인'

<chapter> 
<line> Some text which I want to grab. </line> 
<line> Some more text which I want to grab. </line> 
<line> Even more text which I want to grab. </line> 
</chapter> 

그것은이 같은 구조 사실에서 입니다 자체 폐쇄 형 태그 옆에 서 있어야합니다. 이것들을 잡는 방법을 권할 수 있습니까? 아마도 자바 스크립트/nodejs에?

답변

2

형식은

그러나, 당신은 단지 라인을 구문 분석에 대해 조금 영리해야 할 내용을 구문 분석, 즉 DOMParser 정규 XML 기술을 ... 사용할 수 있도록 유효한 XML이 - 당신이 원하는 각 행을 찾고 텍스트 노드 인 모든 형제 노드를 모아야합니다 (단 하나 여야합니다. 현재 제시하는 코드는 아무런 가정을하지 않습니다).

출력 "구조"를 지정하지 않았지만 여기에 있습니다. 중첩 된 배열을 출력하는 데 사용할 수있는 한 가지 방법 - 첫 번째 수준은 챕터이며 각 장에는 줄 배열이 있습니다

var xml = `<chapter> 
<line /> Some text which I want to grab. 
<line /> Some more text which I want to grab. 
<line /> Even more text which I want to grab. 
</chapter>` 

var parser = new DOMParser(); 
var content = parser.parseFromString(xml, 'application/xml') 
var chapters = content.getElementsByTagName('chapter'); 
var obj = [].reduce.call(chapters, function(result, chapter) { 
    var lines = chapter.getElementsByTagName('line'); 
    result.push([].reduce.call(lines, function(result, line) { 
     var text = ''; 
     for(var node = line.nextSibling; node && node.nodeType == 3; node = node.nextSibling) { 
      text += node.nodeValue; 
     } 
     result.push(text); 
     return result; 
    }, [])) 
    return result; 
}, []); 
console.log(JSON.stringify(obj)); 

코멘트를 해결 - 먼저 일부 문서 :

DOMParse documentation

Array#reduce documentation

이제

Function#call documentation

,이 코드에 [].reduce.call(array, fn)을 설명하기

,

[].reduce.callArray.prototype.reduce.call

getElementsByTagName 축약하는 HTMLCollection에서 배열을 만들 수있는 몇 가지 방법이 있습니다 ... 그것은 아니다 제외하고, 배열처럼 동작하는 ... HTMLCollection을 반환 - 가장 원시적 인가 :

var array = []; 
for(var i = 0; i < collection.length; i++) { 
    array[i] = collection[i]; 
} 

또는

var array = Array.prototype.slice.call(collection); 

또는 (ES2015 +) -하지 IE에서 사용할 수있는 당신은 polyfill하지 않는 한 - 문서

참조
var array = Array.from(collection); 

그러나 [].reduce.call 방법을 사용하면 첫 번째 인수합니다 (this 인수)이 임의 반복 가능한 아니라 배열 될 수 있도록, 따라서 단지 상기 array.reduce(fn) 등에서 array를 사용처럼 - 이는 치료하는 방법 배열과 같은 HTMLcollection, 중간 변수가 필요 없음

+0

정말 고마워요! 이것은 굉장해 보인다.- 그러나 초보자 인 나는 개인적으로 100 %를 따라갈 수 없다 - DomParser가 무엇인지/내가 그것에 대해 더 알아 내기 위해 무엇을 찾아야 하는지를 말해 줄 수 있습니까? (나는 단지 php & java domparsing 튜토리얼을 찾은 것 같습니다)? 나는 또한 이것이하는 일에 대해서 약간 혼란 스럽다.'[] .reduce.call' ('[]'의 표기) –

+0

몇가지 문서 링크와 개요를 추가했습니다. –

+0

감사합니다! 매우 명확한! –

관련 문제