2015-01-14 49 views
1

我想在服務器端(與Nashorn)運行JavaScript,並在javascript代碼中解析XML文件。 默認情況下我們不能這樣做:我們需要加載一些特定的.js庫(DOMParser等)。如何在JavaScript Nashorn引擎中解析XML?

我已經tryied使用Node.js的模塊「XMLDOM」,其未Node.js的使用如下所示:https://github.com/jindw/xmldom/wiki/How-to-use-xmldom-in-non-node.js-JavaScript-platforms-like-Rhino-or-SpiderMonkey

但是這個頁面帶來了新的問題:我們需要封裝的這些負載在對象中.js文件,他們給我們一個例子:

var dpObj = {}; 
loadObject (dpObj, "dom-parser.js"); 

(如果我們只加載在一個典型的方式.js文件,它不工作)

我不知道如何編寫代碼這樣的'loadObject'函數,但它可能是解決方案。也許我們也可以使用Nashorn內的'require'庫?也許有一個很好的替代XMLDOM模塊?

有什麼建議嗎?

PS 1:我已經tryied 'env.rhino.1.2.js'(http://www.envjs.com)爲XMLDOM模塊alternive但這個劇本甚至可以不被犀牛加載...

PS 2:我也tryied在Java中解析XML並使用JavaScript內的結果,但我不知道如何轉換對象(我有一個插入的org.w3c.dom.Document對象,但這不同於JavaScript dom文檔.. 。我有例如gesDescendant方法丟失或類似的東西)。

回答

1

Nashorn支持加載和loadWithNewGlobal原語。

'load'將腳本從URL加載到當前全局作用域中。

'loadWithNewGlobal'將給定的腳本加載到新的全局範圍中。這將避免使用來自加載腳本文件/ URL的全局定義來污染當前全局範圍。

關於這些的更多信息,請參閱「openjdk nashorn extensions」wiki。

(無關)您實際上可以使用Java XML解析器API解析XML文檔,因爲nashorn支持從腳本代碼調用任意Java API。您可以使用Object.bindProperties(在nashorn wiki中記錄的另一個擴展)執行轉換。

+0

謝謝!不幸的是,dom-parser.js的簡單加載失敗(來自XMLDOM Node.js模塊): 'var dpObj = loadWithNewGlobal(「src/main/resources/js/xmldom/dom-parser.js」); print(「dpObj:」+ dpObj);' 將打印: dpObj:undefined,undefined,undefined,undefined,... 也許我應該嘗試你的第二個解決方案 – user2668735

+0

你可以給一個例子,在JavaScript中的java +綁定?例如,你用一個arg(一個java Dom文件)輸入你的JS代碼,並且必須調用一個函數foo來取得一個「Javascript文檔」。 有關信息,這一切都是爲了Blockly:這個想法是在服務器端生成JS代碼。由於轉換函數只存在於JS中,所以我必須在Nashorn內部執行JS函數。 – user2668735