提问人:TSK 提问时间:9/4/2020 最后编辑:TSK 更新时间:9/5/2020 访问量:370
使用 node.js 中的命名空间从响应 XML 访问属性
Accessing the attributes from a response XML with namespaces in node.js
问:
我有一个来自 API 调用的 XML 响应,并且想知道获取属性值(如 serv:result 和 use:sessionTicket 或 node.js 中的任何其他叶元素的最佳且希望最简单的方法,因为我不熟悉这些技术,不确定如何为带有命名空间的嵌套 XML 编写 xpath。下面给出了 XML。
<serv:message xmlns:serv="http://www.webex.com/schemas/2002/06/service" xmlns:com="http://www.webex.com/schemas/2002/06/common" xmlns:use="http://www.webex.com/schemas/2002/06/service/user">
<serv:header>
<serv:response>
<serv:result>SUCCESS</serv:result>
<serv:gsbStatus>PRIMARY</serv:gsbStatus>
</serv:response>
</serv:header>
<serv:body>
<serv:bodyContent xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="use:authenticateUserResponse">
<use:sessionTicket>AAABdFRR6SEAABUYA0gAKEgyU0sAAAAE9w==</use:sessionTicket>
<use:createTime>1599142488352</use:createTime>
<use:timeToLive>5400</use:timeToLive>
</serv:bodyContent>
</serv:body>
</serv:message>
我正在使用带有 express 12.18.1 的节点 v4.16.1。还安装了 npm 模块 [email protected], [email protected], [email protected]
我已经做了很多示例,但无法获得子节点属性。当我完成 xpath 时,我没有得到定义 - 我在下面附加了我的代码和结果输出。
var express = require('express');
var fs = require('fs');
var xml2js = require('xml2js');
var parser = new xml2js.Parser();
var app = express();
app.get('/', function(request, response) {
fs.readFile( './auth_xml.xml', "utf-8", function(err, data) {
if (err) {
return console.log('error:' + err.message);
}
response.send('The File has been read');
parser.parseString(data, function (err, result) {
console.log('xmlns: = ' + result['serv:message']['$']['xmlns:serv']);
console.log('serv:header = ' + result['serv:message']['serv:header']);
console.log('serv:response = ' + result['serv:message']['serv:header']['serv:response']);
});
});
});
app.listen(3000);
控制台的输出为
xmlns: = http://www.webex.com/schemas/2002/06/service
serv:header = [object Object]
serv:response = undefined
有关如何访问子节点 serv:result 的任何指针
答:
-1赞
TSK
9/5/2020
#1
能够使用 RegExp 以相当简单的方式解决它
var result = new RegExp("<serv:result>(.*?)</serv:result?>", "gmi");
var ticket = new RegExp("<use:sessionTicket>(.*?)</use:sessionTicket?>", "gmi");
最终代码 - 以防像我这样的其他灵魂在那里
var express = require('express');
var fs = require('fs');
var xml2js = require('xml2js');
var parser = new xml2js.Parser();
var app = express();
app.get('/', function(request, response) {
fs.readFile( './auth_xml.xml', "utf-8", function(err, data) {
if (err) {
return console.log('error:' + err.message);
}
response.send('The File has been read');
parser.parseString(data, function (err, result) {
var str = '"' + data + '"';
var result = new RegExp("<serv:result>(.*?)</serv:result?>", "gmi");
var ticket = new RegExp("<use:sessionTicket>(.*?)</use:sessionTicket?>", "gmi");
r = result.exec(str);
console.log(r[1]);
t = ticket.exec(str);
console.log(t[1])
});
});
});
app.listen(3000);
评论
0赞
Tomalak
9/5/2020
不要对 XML 使用正则表达式。
0赞
TSK
9/6/2020
有什么理由不使用 RegExp 吗?还有其他方法可以读取子节点吗?
0赞
Tomalak
9/6/2020
你不在XML上使用正则表达式的原因已经讨论得死去活来。XML 对于正则表达式来说太复杂了。OP 没有意识到他们只需要访问一个数组即可获得他们想要的值。这是一个更好的解决方案,他们有 99% 的可及性。
评论
console.log(result)
{ 'serv:message': { '$': { 'xmlns:serv': 'http://www.webex.com/schemas/2002/06/service', 'xmlns:com': 'http://www.webex.com/schemas/2002/06/common', 'xmlns:use': 'http://www.webex.com/schemas/2002/06/service/user' }, 'serv:header': [ [Object] ], 'serv:body': [ [Object] ] } }