2017-06-01 2 views
0

Hallo Ich versuche Script Mediator zu verwenden, um eine SOAP zu tun -> JSON TransformationWSO2 - Script Mediator XML-Property-Abruf mit getPayloadXML();

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

Dieser Teil der Antwort, die ich von dem Test-Service bin empfangen die ich angelegt habe. Frage: Ich kann die Elementdaten, wie in den WO2 ESB-Dokumenten erwähnt, nicht abrufen. Welche

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

I habe sogar versucht

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

Was mache ich hier falsch? Schätzen Sie die Hilfe.

Antwort

1

E4X ist dem Namespace bekannt. Um auf das Element zuzugreifen, das sich in einem Nicht-Standard-Namespace befindet, müssen Sie entweder den Namespace/Präfix deklarieren oder einen Platzhalter * verwenden.

Edit: Einige Debugging in der ESB selbst zeigte mir, dass wir das Wort "Return" nicht verwenden können. Dies ist ein reserviertes Wort und nicht erlaubt, nicht einmal als Teil der Abfragezeichenfolge, um das "return" -Element von Ihrem XML-Code abzurufen.

Lets für einen Moment annehmen, dass das Element "Wert" statt genannt wurde, dann würde der Code kompilieren und zu arbeiten wie folgt:

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

Eine weitere Option ist die Wildcard zu verwenden:

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

Das Ändern der XML-Payload, um JavaScript-Standards zu entsprechen, ist jedoch keine sehr schöne und möglicherweise keine praktikable Lösung. Stattdessen können wir versuchen, das Element auf andere Weise zu erreichen.

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

Das getTestMethodResponse Element ist das Wurzelelement, wenn Sie tun mc.getPayloadXML(), das Sternchen Sie die Kinder dieses Element gibt. Dies funktioniert, ist aber nicht sehr schön, weil es auf einigen Annahmen über die Nachrichtenstruktur basiert.

Eine andere Option könnte sein, komplett auf den Script-Mediator zu verzichten und stattdessen eine PayloadFactory zu verwenden. Zum Beispiel:

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

Für mehr auf E4X, überprüfen here Für mehr auf PayloadFactoryMediator Check here

+0

Danke für die Anregung @ophychius aber dieser Ansatz entweder nicht funktioniert hat. WSO2 Developer Studio ließ mich die Mediationslogik nicht speichern. Es hat etwas mit dieser Zeile zu tun 'var zurück = mc.getPayloadXML() ..: :(ns: zurück) .toString();' – StO

+0

Danke, ich habe es auch so versucht. Wissen Sie, ob es im Developer Studio Protokolle gibt, die ich überprüfen könnte? – StO

+0

Haben Sie versucht, das Namespacepräfix durch einen Platzhalter zu ersetzen? Wenn es immer noch Probleme verursacht, können Sie den vollständigen Fehler/Warnung teilen, die Developer Studio Ihnen gibt? – ophychius

Verwandte Themen