2014-10-27 4 views
1

Кто-нибудь знает, как получить доступ к данным XML, используя выражение xpath в ECMA Script (datapower)?ECMA в Datapower

IBM инфоцентр не имеет этой информации о том, как получить доступ к данным XML

Просьба представить, если у вас есть какие-либо образец сценария для доступа к данным XML

Благодаря

ответ

3

GatewayScript не поддерживает XML Dom в ECMA (Node.js). Я с успехом использовал модули XPATH и DOM. Скачать XMLDOM (https://github.com/jindw/xmldom) и Xpath (https://github.com/goto100/xpath) Node.js модули и добавьте следующие сценарии в каталог DP:

  • дом-parser.js
  • dom.js
  • sax.js
  • xpath.js

использовать его в DataPower ТРУ сначала необходимо получить данные XML из INPUT:

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