2017-06-01 5 views
0

Salut, je suis en train d'utiliser Mediator Script pour faire SOAP -> JSON transformationWSO2 - Récupération des propriétés XML de Script Mediator à l'aide de getPayloadXML();

<ns:getTestMethodResponse xmlns:ns="http://main.wsmediator"> 
<ns:return>getTestMethod is called</ns:return> 
</ns:getTestMethodResponse> 

Cela fait partie de la réponse que je reçois du service de test, je l'ai créé. Question est que je suis incapable d'obtenir les données de l'élément comme mentionné dans les documents WO2 ESB. Ce qui est

mc.getPayloadXML()..::return.toString(); 

J'ai même essayé

mc.getPayloadXML()..::ns:return.toString(); 

ce que je fais mal ici? Appréciez l'aide.

Répondre

1

E4X prend en compte l'espace de noms, donc pour accéder à l'élément qui se trouve dans un espace de noms autre que Default, vous devez déclarer l'espace de noms/préfixe ou utiliser un caractère générique *. Edit: Un peu de débogage dans l'ESB lui-même m'a montré que nous ne pouvons pas utiliser le mot "return". Ceci est un mot réservé, et n'est pas autorisé, même pas dans le cadre de la chaîne de requête pour récupérer l'élément "return" de votre xml.

laisse supposer un instant que l'élément a été appelé « valeur » à la place, le code compilerait et le travail comme suit:

var ns = new Namespace('http://main.wsmediator'); 
var xmlValue = mc.getPayloadXML()..ns::value.toString(); 

Une autre option consiste à utiliser le caractère générique:

var return = mc.getPayloadXML()..*::value.toString(); 

Toutefois, modifier la charge utile xml pour respecter les normes JavaScript n'est pas une très belle solution, et peut-être pas une solution viable. Au lieu de cela, nous pouvons essayer d'accéder à l'élément d'une autre manière.

<inSequence> 
     <script language="js"> 
      var ns = new Namespace('http://main.wsmediator'); 
      var value = mc.getPayloadXML().*.toString(); 
      mc.setProperty("Asterisk", value); 
     </script> 
     <log> 
      <property name="Asterisk" expression="get- 
       property('Asterisk')"/> 
     </log> 
     <respond/> 
</inSequence> 

L'élément getTestMethodResponse est l'élément racine lorsque vous faites mc.getPayloadXML(), l'astérisque vous donne les enfants de cet élément. Cela fonctionne, mais n'est pas très joli parce qu'il est basé sur certaines hypothèses sur la structure du message.

Une autre option pourrait être de renoncer complètement à l'utilisation du médiateur de script et d'utiliser un objet PayloadFactory à la place. Par exemple:

<payloadFactory media-type="json"> 
     <format> 
      {"return":"$1"} 
     </format> 
     <args> 
     <arg xmlns:ns="http://main.wsmediator" 
        evaluator="xml" 
        expression="//ns:return"/> 
     </args> 
</payloadFactory> 

Pour en savoir plus sur E4X, consultez here Pour en savoir plus sur PayloadFactoryMediator check here

+0

Merci pour la suggestion @ophychius mais cette approche ne fonctionne pas non plus. WSO2 Developer Studio ne m'a pas laissé sauvegarder la logique de médiation. 'var retour = mc.getPayloadXML() ..: :(ns: return) .toString();' – StO

+0

Merci, j'ai essayé de cette façon aussi. Savez-vous s'il y a des logs sur Developer Studio que je pourrais vérifier? – StO

+0

Avez-vous essayé de remplacer le préfixe d'espace de noms par un caractère générique? Si cela pose toujours des problèmes, pouvez-vous partager l'erreur/avertissement complet que Developer Studio vous donne? – ophychius