【问题标题】:ECMA in DatapowerDatapower 中的 ECMA
【发布时间】:2014-10-27 06:15:18
【问题描述】:

有人知道如何在 ECMA Script(datapower) 中使用 xpath 表达式访问 XML 数据吗?

IBM 信息中心没有关于如何访问 XML 数据的信息

如果您有任何用于访问 XML 数据的示例脚本,请提供

谢谢

【问题讨论】:

    标签: javascript ibm-datapower


    【解决方案1】:

    GatewayScript 不支持已实现的 ECMA (Node.js) 中的任何 XML Dom。 然而,我使用模块 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
        }
    
    }
    

    这应该是一个工作示例...如果您移动它们,您需要更改模块的路径。 我在 store:/// 中有一个目录,我在其中添加了我的 GWS 模块。

    希望你能飞起来!

    【讨论】:

      【解决方案2】:

      至少从 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);
          }
        });
      });
      

      【讨论】:

      • 正确,从 7.0 开始有 transform() 模块。但是我遇到了一些问题,如果找不到 XPath,它会抛出错误,并且我在使用 XML 属性时遇到了一些困难,所以我现在坚持使用 XPath 模块......
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多