2016-05-03 85 views
4

我想使用一些文檔屬性(以xml格式)作爲節點,以便我可以使用子元素。到目前爲止,我有:如何將對象轉換爲節點

var counts = []; 
for (var p of xdmp.documentProperties(uris)) { 
    var isANode = p instanceof Node; // false (actually true - see edit) 

    var count = xdmp.xqueryEval('fn:count(' + p + '//data)') 
    counts.push(count) 
} 
counts 

我見過nodebuilder例子MarkLogic文檔中,我想使用這個接口。例如

myNode.xpath('//data') 
var children = myNode.childNodes() 

而不是使用XPath評估有沒有辦法將對象轉換爲節點?或者,有沒有更好的方法來處理服務器端JavaScript中的現有XML?

在XQuery中,我可以使用xdmp:tranform-to-json(),但該函數不在SJS中提供。

編輯:

在我試圖提供一個乾淨的代碼示例中,我留下了重要的信息。我已經我的代碼結構如下:

for (var uri of cts.uriMatch('/pattern/*')) { 
    var p = xdmp.documentProperties(uri); 
    var isANode = p instanceof Node; // false 
    // ... 
} 

代替

for (var p of xdmp.documentProperties(cts.uriMatch('/pattern/*'))) { 
    var isANode = p instanceof Node; // true 
    // ... 
} 

返回的類型是ValueIterator的XQuery序列的其等效,並且可以使用訪問:

xdmp.documentProperties(uri).next().value 
+0

基於意見:在做任何邏輯之前,我總是將我的xml解析爲json。如果你不喜歡使用xml,那麼讓生活變得更容易。 – Shilly

+0

@Shilly:你是指數據庫還是迭代XML元素?你如何在JavaScript中將XML轉換爲JSON? – chriskelly

+0

在使用前從服務器接收數據時。對於複雜的xml文檔,我只需遍歷所有子節點並將值保存在嵌套對象中。對於簡單的XML,我只是用正則表達式解析出相關的數據。 (不建議用於非簡單的xml)或者查看您的框架的插件。幾乎所有的人現在都有一些xml和json utils。 – Shilly

回答

7

這在QConsole中爲我工作:

var uris = ['/test.xml', '/test2.xml']; 
var counts = []; 
for (var p of xdmp.documentProperties(uris)) { 
    counts.push(fn.count(p.xpath('//data'))) 
} 
counts 

在我的測試中,每個p都是一個節點。我使用xquery腳本創建了一些示例數據。

let $test-data := (
    <priority> 
    <data>hello</data> 
    </priority>, 
    <status> 
    <data>hi</data> 
    </status> 
) 
return 
(
    xdmp:document-set-properties("/test.xml", $test-data), 
    xdmp:document-set-properties("/test2.xml", $test-data) 
)