邮递员:如何解析XML主机响应内的CDATA中的xml?

问题描述

我已经在这里和其他地方阅读了多个资源,但未能解决我的问题。

我以XML发送POST请求到具有由另一个XML“请求”组成的CDATA的主机,并且响应具有相同的结构。 我需要从CDATA内的嵌套XML响应中提取一个属性(“ ATTRIBUTE7”),该属性将成为Postman中的环境变量。 我的理解是,由于CDATA的存在,VASDataString的内容被视为一块文本,不应对其进行解析。

我如何超越这个障碍?

请求

<?xml version="1.0" encoding="UTF-8"?>
<va:VASMessage xmlns:va="http://subdomain.domain.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://subdomain.domain.com" file:/C:/work/work-idea/somewhere/vas.xsd"  Version="1.1.2">
    <va:Header>
        <va:HeadElem1>ABC123</va:HeadElem1>
        <va:HeadElem2>192</va:HeadElem2>
        <va:OriginalTime>2020-05-13T17:21:00</va:OriginalTime>
        <va:TransactionCode>70</va:TransactionCode>
        <va:ReqProcessing>0</va:ReqProcessing>
        <va:MessageType>0</va:MessageType>
        <va:MessageDirection>0</va:MessageDirection>
    </va:Header>
    <va:Body>
        <va:VASProviderID>ABC</va:VASProviderID>
        <va:VASProductID>PIPPO</va:VASProductID>
        <va:VASMessageType>PIPPO_REQUEST</va:VASMessageType>
        <va:TransactionTime>2020-05-13T17:21:00</va:TransactionTime>
        <va:RetailerID>0101</va:RetailerID>
        <va:BranchID>01</va:BranchID>
        <va:ShopID>0001</va:ShopID>
        <va:POSID>001</va:POSID>
        <va:VASDataString><![CDATA[
        <HostMessage>
            <PIPPO_REQUEST>
                <HostRequest>
                    <Header Attr1="AB12" Timestamp="{{TimeStamp}}000" />
                    <GORDO Operation="000192" />
                    <Check>
                        <Request Attr2="000100031408" Attr3="8029513427007" Attr4="2500">
                            <ElemX Attr5="29" />
                        </Request>
                    </Check>
                </HostRequest>
            </PIPPO_REQUEST>
        </HostMessage>]]>
        </va:VASDataString>
    </va:Body>
</va:VASMessage>

响应:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><VASMessage xmlns="http://subdomain.domain.com">
    <Header>
        <HeadElem1>ABC123</HeadElem1>
        <HeadElem2>192</HeadElem2>
        <OriginalTime>2020-05-13T17:21:00.000+02:00</OriginalTime>
        <TransactionCode>70</TransactionCode>
        <ReqProcessing>false</ReqProcessing>
        <MessageType>false</MessageType>
        <MessageDirection>true</MessageDirection>
        <ResponseCode>0</ResponseCode>
    </Header>
    <Body>
        <VASProviderID>ABC</VASProviderID>
        <VASProductID>PIPPO</VASProductID>
        <VASMessageType>PIPPO_RESPONSE</VASMessageType>
        <TransactionTime>2020-05-13T17:21:00.000+02:00</TransactionTime>
        <RetailerID>0101</RetailerID>
        <BranchID>01</BranchID>
        <ShopID>0001</ShopID>
        <POSID>001</POSID>
        <VASDataString>&lt;HostMessage&gt;
                &lt;PIPPO_RESPONSE&gt;
                    &lt;HostResponse Attr6="0000" ATTRIBUTE7="00039208052" Versione="2.0"&gt;
                        &lt;Header Attr8="XYZ" Attr9="0101010001001000192" Attr1="CD23" Timestamp="20200513184508520"/&gt;



                        &lt;Result Attr10="25838" ExDate="20220331" Attr11="000100031408"/&gt;
                    &lt;/HostResponse&gt;
                &lt;/PIPPO_RESPONSE&gt;
            &lt;/HostMessage&gt;</VASDataString>
    </Body>
</VASMessage>

测试(邮递员)中有:

var responseJson = xml2Json(responseBody);
console.log(responseJson);

,控制台中的输出为:

{VASMessage: {…}}

1. ▶VASMessage: {…}
  1. ▶$: {…}
    1. xmlns: "http://subdomain.domain.com"
  2. ▶Header: {…}
    HeadElem1: "SIA0101010001001"
    HeadElem2: "192"
    OriginalTime: "2020-05-13T17:21:00.000+02:00"
    TransactionCode: "70"
    ReqProcessing: "false"
    MessageType: "false"
    MessageDirection: "true"
    AeviResponseCode: "0"
  3. ▶Body: {…}
    VASProviderID: "ABC"
    VASProductID: "PIPPO"
    VASMessageType: "PIPPO_RESPONSE"
    TransactionTime: "2020-05-13T17:21:00.000+02:00"
    RetailerID: "0101"
    BranchID: "01"
    ShopID: "0001"
    POSID: "001"
    VASDataString: "<HostMessage>
        <PIPPO_RESPONSE>
<HostResponse Attr6="0000" ATTRIBUTE7="00020226551" Versione="2.0">
    <Header Attr8="XYZ" Attr9="0101010001001000192000265" Attr1="CD23" Timestamp="20200921121950064"/>
    
    
    
    
                <Result Attr10="25838" ExDate="20220930" Attr11="000100031408"/>
</HostResponse>


        </PIPPO_RESPONSE>
    </HostMessage>"

谢谢。

解决方法

解决方案:

const xml2js = require('xml2js');
xml2js.parseString(pm.response.text(),(err,result) => {
    if (err) {
        console.error(err);
        return;
    }

    const body = result.VASMessage.Body[0].VASDataString[0];
    
    xml2js.parseString(body,result) => {
        if (err) {
            console.error(err);
            return;
        }

        pm.environment.set("ATTRIBUTE7",JSON.stringify(result.HostMessage.PIPPO_RESPONSE[0].HostResponse[0].$.ATTRIBUTE7));

           console.log(rresult.HostMessage.PIPPO_RESPONSE[0].HostResponse[0].$.ATTRIBUTE7);

    })
});