使用 node.js 中的命名空间从响应 XML 访问属性

Accessing the attributes from a response XML with namespaces in node.js

提问人:TSK 提问时间:9/4/2020 最后编辑:TSK 更新时间:9/5/2020 访问量:370

问:

我有一个来自 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 的任何指针

节点 .js XML XPath 命名空间

评论

0赞 Tomalak 9/4/2020
“请你们专家指导一下。”= “你能帮我写代码吗?”不是这样工作的。有大量的例子可以说明如何处理地球上几乎任何语言的 XML(命名空间或无),包括 JS/node。从看起来很有前途的地方开始,尝试一下,如果你的代码有问题,你可以在这里发布。要求人们简单地为您编写代码不是这个网站的想法。
1赞 TSK 9/4/2020
感谢 Tomalak 的反馈 - 我做了很多示例,但无法访问子节点 - 我在下面附上了我的代码和结果输出
0赞 TSK 9/4/2020
我已经更新了我的问题以反映我的代码和输出
0赞 Tomalak 9/4/2020
这样就好多了。你试过看看它是什么样子的吗?这是一个常规的 JS 对象,您应该能够导航它没有问题。console.log(result)
0赞 TSK 9/5/2020
尝试了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] ] } }

答:

-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% 的可及性。