【问题标题】:Accessing the attributes from a response XML with namespaces in node.js使用 node.js 中的命名空间从响应 XML 访问属性
【发布时间】:2020-09-04 10:01:46
【问题描述】:

我有一个来自 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>

我正在使用 node v12.18.3 和 express 4.16.1。还安装了 npm 模块 xml2js@0.4.23、xml2json@0.12.0、xml-stream@0.4.5

我做了很多示例,但无法获得子节点属性。当我完成 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 的任何指针

【问题讨论】:

  • "请各位专家指导我完成此过程。" = "请您为我编写代码。"不是它是如何工作的。有大量关于如何用地球上几乎任何语言处理 XML(命名空间或无命名空间)的示例,包括 JS/node。从看起来很有希望的地方开始,尝试一下,如果你的代码遇到问题,你可以在这里发布。要求人们简单地为您编写代码不是本网站的想法。
  • 感谢 Tomalak 的反馈 - 我已经做了很多示例,但无法访问子节点 - 我在下面附上了我的代码和结果输出
  • 我已经更新了我的问题以反映我的代码和输出
  • 这样好多了。你试过console.log(result) 看看它是什么样子的吗?它是一个普通的 JS 对象,你应该可以导航没有问题。
  • 试过 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] ] } }

标签: node.js xml xpath namespaces


【解决方案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);

【讨论】:

  • 不要对 XML 使用正则表达式。
  • 有什么理由不使用正则表达式?还有其他读取子节点的方法吗?
  • 您不在 XML 上使用正则表达式的原因已经被讨论了到死。 XML 对于正则表达式来说太复杂了。 OP 没有意识到他们只需要访问一个数组来获得他们想要的值。这是一个更好的解决方案,他们 99% 都可以使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多