2014-10-27 87 views
1

任何人都知道如何使用ECMA Script(datapower)中的xpath表達式來訪問XML數據?如果您有任何示例腳本,用於訪問XML數據ECMA in Datapower

感謝

回答

3

GatewayScript不支持任何XML

IBM信息中心不會對如何訪問XML數據信息

請提供Dom在ECMA(Node.js)中實現。 但是我使用了模塊XPATH和DOM,並取得了巨大的成功。 下載XMLDOM(https://github.com/jindw/xmldom)和XPath(https://github.com/goto100/xpath)Node.js加載模塊及以下腳本添加到您的DP目錄:

  • DOM-parser.js
  • dom.js
  • sax.js
  • xpath.js

要在DataPower的GWS使用它,你首先需要從INPUT獲得XML數據:

// This is where we start, grab the INPUT as a buffer 
session.input.readAsBuffers(function(readAsBuffersError, data) { 


    if (readAsBuffersError) { 
     console.error('Error on readAsBuffers: ' + readAsBuffersError); 
     session.reject('Error on readAsBuffers: ' + readAsBuffersError); 
    } else { 

     if (data.slice(0,5).toString() === '<?xml') { 

      console.log('It is XML!'); 
      parseXML(data); 

     } 
    } //end read as buffers error 
}); //end read as buffer function 

function parseXML(xml) { 
    // Load XML Dom and XPath modules 
    var select = require('local:///xpath.js'); 
    var dom = require('local:///dom-parser.js'); 

    var doc = new dom.DOMParser().parseFromString(xml.toString(), 'text/xml'); 
    // Get attribute 
    var nodes = select(doc, "//root/element1/@protocol"); 
    try { 
     var val = nodes[0].value.toString(); 
     console.log('found xml attribute as ['+val+']'); 
    } catch(e) { 
     // throw error here 
    } 

    // Get an element 
    nodes = select(doc, "//root/element1/child1"); 
    try { 
     var val = nodes[0].firstChild.data; 
     console.log('elemnt found as ['+val+']'); 
    } catch(e) { 
     //throw error here 
    } 

} 

這應該是一個工作示例...如果移動模塊,則需要更改模塊的路徑。 我有一個商店目錄:///我在哪裏添加我的GWS模塊。

希望你會得到它飛!

1

至少7.0.0固件版本Gatewayscript能夠輕鬆地使用XPATH和DOM。從DP商店中摘錄的內容:

//reading body from the rule input 
session.input.readAsXML(function (error, nodeList) { 
    if (error) { 
    //error behaviour 
    } else { 
    var domTree; 
    try { 
     domTree = XML.parse(nodeList); 
    } catch (error) { 
     //error behaviour 
    } 

    var transform = require('transform'); //native gatewayscript module 
    transform.xpath('/someNode/anotherNode/text()', domTree, function(error, result){ 
     if(error){ 
     //error behaviour 
     } 
     //some use of result, for example putting it to output 
     session.output.write(result); 
    } 
    }); 
}); 
+0

正確,從7.0開始,就有了transform()模塊。然而,我有一些問題,它會拋出錯誤,如果XPath沒有找到,我有一些困難與XML屬性使用它,所以我現在堅持使用XPath模塊... – Anders 2017-07-16 06:31:18