2013-07-01 56 views
0

在Netsuite腳本中我試圖解析來自EchoSign Webservice的響應。來自EchoSign的反應是這樣的通過NetSuite腳本解析XML(SOAP響應)

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Body> 
     <getFormDataResponse xmlns="http://api.echosign"> 
      <getFormDataResult xmlns="http://api.echosign"> 
       <errorCode xmlns="http://dto8.api.echosign">OK</errorCode> 
       <errorMessage xmlns="http://dto8.api.echosign" xsi:nil="true" /> 
       <formDataCsv xmlns="http://dto8.api.echosign">SOME DATA </formDataCsv> 
       <success xmlns="http://dto8.api.echosign">true</success> 
      </getFormDataResult> 
     </getFormDataResponse> 
    </soap:Body> 
</soap:Envelope> 

而且我NetSuite的代碼是在這裏

var response = nlapiRequestURL(echoSignUrl, postStr, header); 
    var xml = nlapiStringToXML(response.getBody()); 

    var resData = nlapiSelectNode(xml, 'soap:Envelope/soap:Body'); // /getFormDataResult/success'); 
    if (resData) 
     return nlapiSelectValue(resData, 'formDataCsv'); 

但不知何故,我總是從nlapiSelectValue方法得不到任何回報!

回答

2

沒有任何前綴節點應使用缺省前綴nlapi來訪問:

爲例如/ soap:Envelope/soap:Body/nlapi:getFormDataResponse

+0

奇怪的方式來處理,但它的工作。感謝您的迴應。 – azeem

1

這似乎是命名空間處理方式的一個問題。使用Notepad ++的XML Tools插件和您提供的XML,XPATH當前節點選擇器甚至無​​法正確找到getFormDataResponse節點。它僅僅因爲「未知的例外」而失敗。

我也試過手動評估以下表達式:

  • /soap:Envelope/soap:Body(作品)
  • /soap:Envelope/soap:Body/getFormDataResponse(失敗)
  • /soap:Envelope/soap:Body//getFormDataResponse(失敗)
  • /soap:Envelope/soap:Body/*[local-name() = 'getFormDataResponse'](失敗)
  • /soap:Envelope/soap:Body/descendants::*[local-name() = 'getFormDataResponse'](失敗)
  • ​​(失敗)

如果我修改XML這樣的EchoSign命名空間是在信封有一個前綴,像這樣:

<soap:Envelope xmlns:echo="http://api.echosign" xmlns:dto8="http://dto8.api.echosign" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <soap:Body> 
     <echo:getFormDataResponse> 
      <echo:getFormDataResult> 
       <dto8:errorCode>OK</dto8:errorCode> 
       <dto8:errorMessage xsi:nil="true" /> 
       <dto8:formDataCsv>SOME DATA</dto8:formDataCsv> 
       <dto8:success>true</dto8:success> 
      </echo:getFormDataResult> 
     </echo:getFormDataResponse> 
    </soap:Body> 
</soap:Envelope> 

則路徑選擇可以得到一路下跌至formDataCsv節點正確。它返回路徑:/soap:Envelope/soap:Body/echo:getFormDataResponse/echo:getFormDataResult/dto8:formDataCsv。 不知道這是多麼有幫助,因爲你不控制EchoSign發送給你的XML,但我不知道如何正確格式化XPATH來處理命名空間。

+0

完全同意,但正如您所提到的,xml來自EchoSign,所以不能做太多的事情。 – azeem