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

时间:2017-07-01 10:32:22

标签: json node.js xml xmldom

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

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

2 个答案:

答案 0 :(得分:2)

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
    }
  ]
}

我只是在模板中添加一些字段进行测试。您可以根据需要添加更多基础。

答案 1 :(得分:1)

试试这个。您可以根据需要在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"}