如何解析从 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 中随意映射它。我只是告诉你方向。
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
}
]
}
我只是在模板中添加了几个字段来测试。您可以根据需要添加更多基础。
我需要帮助来解析从 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 中随意映射它。我只是告诉你方向。
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
}
]
}
我只是在模板中添加了几个字段来测试。您可以根据需要添加更多基础。