如何parsing从SOAP WS的XML响应创build的JSON?

我需要帮助parsing从NodeJS中SOAP Web服务的XML响应创build的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 

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

我只是在模板中添加几个字段来testing。 你可以添加更多的基础上你所需要的。

尝试这个。 你可以按照你想要的在JSON中映射它。 我只是告诉你方向。

在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"}