如何解析从 SOAP WS 的 XML 响应创建的 JSON?

How to parse JSON created from XML response of SOAP WS?

我需要帮助来解析从 NodeJS 中的 SOAP 网络服务的 XML 响应创建的 JSON。我想要一个 JSON 数组 notifications.

XML如下:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:getNotificationsResponse xmlns:ns2="---url---">
         <return>
            <notifications>
               <ackRequired>false</ackRequired>
               <body>Testing Notitfications</body>
               <created>1498798404874</created>
               <gpsAlt>1.0</gpsAlt>
               <gpsLat>1.0</gpsLat>
               <gpsLong>1.0</gpsLong>
               <messageId>253</messageId>
               <priority>INFORMATIONAL</priority>
               <senderClientId>PMC0</senderClientId>
               <status>SENT</status>
               <subject>Test Notification</subject>
               <updated>1498798404874</updated>
               <userId>1</userId>
               <userLogin>ipics</userLogin>
            </notifications>
            <notifications>
               <ackRequired>false</ackRequired>
               <body>Test notitfication</body>
               <created>1498797535714</created>
               <gpsAlt>0.0</gpsAlt>
               <gpsLat>0.0</gpsLat>
               <gpsLong>0.0</gpsLong>
               <messageId>244</messageId>
               <priority>HIGH</priority>
               <senderClientId>PMC_1234</senderClientId>
               <status>SENT</status>
               <subject>Test</subject>
               <updated>1498797535714</updated>
               <userId>1</userId>
               <userLogin>ipics</userLogin>
            </notifications>
            <notifications>
               <ackRequired>false</ackRequired>
               <body>Testing Notitfications</body>
               <created>1498794764538</created>
               <gpsAlt>1.0</gpsAlt>
               <gpsLat>1.0</gpsLat>
               <gpsLong>1.0</gpsLong>
               <messageId>239</messageId>
               <priority>INFORMATIONAL</priority>
               <senderClientId>PMC0</senderClientId>
               <status>SENT</status>
               <subject>Test Notification</subject>
               <updated>1498794764538</updated>
               <userId>1</userId>
               <userLogin>ipics</userLogin>
            </notifications>
            <notifications>
               <ackRequired>false</ackRequired>
               <body>Testing Notitfications</body>
               <created>1498794760123</created>
               <gpsAlt>1.0</gpsAlt>
               <gpsLat>1.0</gpsLat>
               <gpsLong>1.0</gpsLong>
               <messageId>234</messageId>
               <priority>INFORMATIONAL</priority>
               <senderClientId>PMC0</senderClientId>
               <status>SENT</status>
               <subject>Test Notification</subject>
               <updated>1498794760123</updated>
               <userId>1</userId>
               <userLogin>ipics</userLogin>
            </notifications>
         </return>
      </ns2:getNotificationsResponse>
   </soap:Body>
</soap:Envelope>

我正在使用 xmldom 节点模块。
我的代码如下,但是没有给出正确的响应。

var doc = new DOMParser().parseFromString(data.response, 'text/xml');
var valueXML = doc.getElementsByTagName('return');
var temp = valueXML[0].getElementsByTagName("notifications")[0];
var output = temp.getElementsByTagName("nextSibling")._node.childNodes.parentNode

试试这个。您可以在 JSON 中随意映射它。我只是告诉你方向。

Working example in codepen

var response = `
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns2:getNotificationsResponse xmlns:ns2="---url---">
         <return>
            <notifications>
               <ackRequired>false</ackRequired>
               <body>Testing Notitfications</body>
               <created>1498798404874</created>
               <gpsAlt>1.0</gpsAlt>
               <gpsLat>1.0</gpsLat>
               <gpsLong>1.0</gpsLong>
               <messageId>253</messageId>
               <priority>INFORMATIONAL</priority>
               <senderClientId>PMC0</senderClientId>
               <status>SENT</status>
               <subject>Test Notification</subject>
               <updated>1498798404874</updated>
               <userId>1</userId>
               <userLogin>ipics</userLogin>
            </notifications>
            <notifications>
               <ackRequired>false</ackRequired>
               <body>Test notitfication</body>
               <created>1498797535714</created>
               <gpsAlt>0.0</gpsAlt>
               <gpsLat>0.0</gpsLat>
               <gpsLong>0.0</gpsLong>
               <messageId>244</messageId>
               <priority>HIGH</priority>
               <senderClientId>PMC_1234</senderClientId>
               <status>SENT</status>
               <subject>Test</subject>
               <updated>1498797535714</updated>
               <userId>1</userId>
               <userLogin>ipics</userLogin>
            </notifications>
            <notifications>
               <ackRequired>false</ackRequired>
               <body>Testing Notitfications</body>
               <created>1498794764538</created>
               <gpsAlt>1.0</gpsAlt>
               <gpsLat>1.0</gpsLat>
               <gpsLong>1.0</gpsLong>
               <messageId>239</messageId>
               <priority>INFORMATIONAL</priority>
               <senderClientId>PMC0</senderClientId>
               <status>SENT</status>
               <subject>Test Notification</subject>
               <updated>1498794764538</updated>
               <userId>1</userId>
               <userLogin>ipics</userLogin>
            </notifications>
            <notifications>
               <ackRequired>false</ackRequired>
               <body>Testing Notitfications</body>
               <created>1498794760123</created>
               <gpsAlt>1.0</gpsAlt>
               <gpsLat>1.0</gpsLat>
               <gpsLong>1.0</gpsLong>
               <messageId>234</messageId>
               <priority>INFORMATIONAL</priority>
               <senderClientId>PMC0</senderClientId>
               <status>SENT</status>
               <subject>Test Notification</subject>
               <updated>1498794760123</updated>
               <userId>1</userId>
               <userLogin>ipics</userLogin>
            </notifications>
         </return>
      </ns2:getNotificationsResponse>
   </soap:Body>
</soap:Envelope>`;
    
var doc = new DOMParser().parseFromString(response, 'text/xml');
var valueXML = doc.getElementsByTagName('return');
var temps = valueXML[0].children;
var nortifications=[];

for (var i = 0; i < temps.length; i++) {
    var temp = temps[i].children;
    var obj = {};
    
    for (var j = 0; j < temp.length; j++) {
        var property = temp[j];
       
        obj[property.localName] = property.innerHTML;
    }

    console.log(JSON.stringify(obj));
    nortifications.push(obj);
}

输出:

{"ackRequired":"false","body":"Testing Notitfications","created":"1498798404874","gpsAlt":"1.0","gpsLat":"1.0","gpsLong":"1.0","messageId":"253","priority":"INFORMATIONAL","senderClientId":"PMC0","status":"SENT","subject":"Test Notification","updated":"1498798404874","userId":"1","userLogin":"ipics"}  
{"ackRequired":"false","body":"Test notitfication","created":"1498797535714","gpsAlt":"0.0","gpsLat":"0.0","gpsLong":"0.0","messageId":"244","priority":"HIGH","senderClientId":"PMC_1234","status":"SENT","subject":"Test","updated":"1498797535714","userId":"1","userLogin":"ipics"}
{"ackRequired":"false","body":"Testing Notitfications","created":"1498794764538","gpsAlt":"1.0","gpsLat":"1.0","gpsLong":"1.0","messageId":"239","priority":"INFORMATIONAL","senderClientId":"PMC0","status":"SENT","subject":"Test Notification","updated":"1498794764538","userId":"1","userLogin":"ipics"} 
{"ackRequired":"false","body":"Testing Notitfications","created":"1498794760123","gpsAlt":"1.0","gpsLat":"1.0","gpsLong":"1.0","messageId":"234","priority":"INFORMATIONAL","senderClientId":"PMC0","status":"SENT","subject":"Test Notification","updated":"1498794760123","userId":"1","userLogin":"ipics"}
const transform = require('camaro')
const fs = require('fs')

const xml = fs.readFileSync('so.xml', 'utf-8')
const template = {
    notifications: ['//notifications', {
        ackRequired: 'ackRequired',
        body: 'body',
        created: 'created',
        gpsAlt: 'number(gpsAlt)'
    }]
}

const result = transform(xml, template)
console.log(JSON.stringify(result, null, 2))

并输出:

{
  "notifications": [
    {
      "ackRequired": "false",
      "body": "Testing Notitfications",
      "created": "1498798404874",
      "gpsAlt": 1
    },
    {
      "ackRequired": "false",
      "body": "Test notitfication",
      "created": "1498797535714",
      "gpsAlt": 0
    },
    {
      "ackRequired": "false",
      "body": "Testing Notitfications",
      "created": "1498794764538",
      "gpsAlt": 1
    },
    {
      "ackRequired": "false",
      "body": "Testing Notitfications",
      "created": "1498794760123",
      "gpsAlt": 1
    }
  ]
}

我只是在模板中添加了几个字段来测试。您可以根据需要添加更多基础。