형식은
그러나, 당신은 단지 라인을 구문 분석에 대해 조금 영리해야 할 내용을 구문 분석, 즉 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.call
이 Array.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, 중간 변수가 필요 없음
정말 고마워요! 이것은 굉장해 보인다.- 그러나 초보자 인 나는 개인적으로 100 %를 따라갈 수 없다 - DomParser가 무엇인지/내가 그것에 대해 더 알아 내기 위해 무엇을 찾아야 하는지를 말해 줄 수 있습니까? (나는 단지 php & java domparsing 튜토리얼을 찾은 것 같습니다)? 나는 또한 이것이하는 일에 대해서 약간 혼란 스럽다.'[] .reduce.call' ('[]'의 표기) –
몇가지 문서 링크와 개요를 추가했습니다. –
감사합니다! 매우 명확한! –