如何使用 node.js 获取 SOAP 主体?

iaf*_*rek 1 javascript soap node.js

我有以下格式的传入 SOAP 消息:

const soap = `
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
    <env:Header/>
    <env:Body property="def">
        <Root>
            <Abc attr="abc">123456</Abc>
        </Root>
    </env:Body>
</env:Envelope>
`;
Run Code Online (Sandbox Code Playgroud)

我期望得到的是<env:Body>不变的内容:

<Root>
    <Abc attr="abc">123456</Abc>
</Root>
Run Code Online (Sandbox Code Playgroud)

要提取正文,我使用简单的正则表达式:

function getSoapBody(xmlStr) {
    let soapBody = null;
    if (xmlStr) {
        const soapBodyRegex = /<env:Body>([\s\S]*)<\/env:Body>/im;
        const soapBodyRegexMatchResult = xmlStr.match(soapBodyRegex);
        soapBody = soapBodyRegexMatchResult[1];
    }
    return soapBody;
}
Run Code Online (Sandbox Code Playgroud)

但是,使用正则表达式获取 body 当然并不理想。

此外,我不想重新发明轮子,我正在寻找一种解决方案(甚至 npm 包),无论使用什么前缀(如果前缀发生变化,上面的正则表达式都会失败)或者是否有可选属性,它基本上都会 getSoapBody等等。

Ter*_*nox 6

您可以使用 xml2js 来解析:

var xml2js = require('xml2js');
var builder = new xml2js.Builder();

const soap = `
<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope">
    <env:Header/>
    <env:Body optional="abc">
        <Root>
            <Abc attr="1">123456</Abc>
        </Root>
    </env:Body>
</env:Envelope>
`;

var options = {explicitArray: false, tagNameProcessors: [xml2js.processors.stripPrefix] };

xml2js.parseString(soap, options, (err, result) => {
    if (err) {
        console.log('An error has occurred: ' + err);
        return;
    } 

    // Get the soap body object
    var soapBody = result.Envelope.Body;

    // Remove optional attribute(s) from <Body> element.
    if (soapBody.$) {
        delete soapBody.$;
    }

    // Get the body XML if needed
    var soapBodyXML = builder.buildObject(soapBody);

    console.log(soapBodyXML);
});
Run Code Online (Sandbox Code Playgroud)