2017-03-23 28 views
0

我有一個具有以下結構的文件。這不是XML,但我需要以某種方式製作一個JSON。如何解析XML類結構的文件,但在內容旁邊使用自閉標籤(而不是包含內容)

所以,而我希望文件看起來像這樣:

<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> 

事實上,這是結構這樣

<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> 

所以每章的「線」只是站在自閉線標籤旁邊。你能推薦一種抓住這些的方法嗎?可能在javascript/nodejs中?

回答

2

的格式是有效的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.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可用,除非你填充工具 - 看到文檔

var array = Array.from(collection); 

然而,使用.call方法上[].reduce允許第一參數(this參數)是任何可迭代,而不只是一個數組,所以它就像使用array從上述像array.reduce(fn) - 它是用於治療方式HTMLcollection就像一個數組,不需要中間變量

+0

非常感謝你!這看起來很神奇。 - 然而,作爲一個初學者,我個人不能100%遵守 - 你能告訴我DomParser是什麼/我需要尋找更多關於它的信息(我似乎只能找到php&java domparsing教程)?我對這樣做有點困惑:'[] .reduce.call'(尤指'[]'的這種表示法) –

+0

我已經添加了一些文檔鏈接和概述 –

+0

謝謝!非常清楚! –

相關問題