的格式是有效的XML,所以你可以使用常規的XML技術...即DOMParser
,解析內容
但是,你只需要有點聰明關於解析行 - 你想找到每一行,並收集文本節點的所有兄弟節點(應該只有一個,但我提供的代碼不作任何假設)
您沒有指定輸出「結構」,但這裏是你可以使用哪種方法輸出一個嵌套數組 - 第一級是章節,在每一章中都有一系列行
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可用,除非你填充工具 - 看到文檔
var array = Array.from(collection);
然而,使用.call
方法上[].reduce
允許第一參數(this
參數)是任何可迭代,而不只是一個數組,所以它就像使用array
從上述像array.reduce(fn)
- 它是用於治療方式HTMLcollection就像一個數組,不需要中間變量
非常感謝你!這看起來很神奇。 - 然而,作爲一個初學者,我個人不能100%遵守 - 你能告訴我DomParser是什麼/我需要尋找更多關於它的信息(我似乎只能找到php&java domparsing教程)?我對這樣做有點困惑:'[] .reduce.call'(尤指'[]'的這種表示法) –
我已經添加了一些文檔鏈接和概述 –
謝謝!非常清楚! –