【问题标题】:Parsing XML (SOAP Response) through NetSuite Script通过 NetSuite 脚本解析 XML(SOAP 响应)
【发布时间】:2013-07-02 02:29:16
【问题描述】:

在 Netsuite 脚本中,我试图解析来自 EchoSign Webservice 的响应。 EchoSign 的回复是这样的

    <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 方法中得不到任何回报!

【问题讨论】:

    标签: soap xml-parsing netsuite echosign


    【解决方案1】:

    应该使用默认前缀访问没有任何前缀的节点 nlapi:

    例如/soap:信封/soap:正文/nlapi:getFormDataResponse

    【讨论】:

    • 奇怪的处理方式,但它奏效了。感谢您的回复。
    【解决方案2】:

    处理命名空间的方式似乎存在问题。使用 Notepad++ 的 XML 工具插件和您提供的 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'](失败)
    • /soap:Envelope/soap:Body/descendants::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 以处理命名空间。

    【讨论】:

    • 完全同意,但正如你所提到的,xml 来自 EchoSign,所以对此无能为力。
    猜你喜欢
    • 2021-10-29
    • 2021-06-07
    • 2016-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多