一尘不染

Node.js Xml2js来自属性的结果

node.js

我究竟做错了什么?我无法获得子属性内标签的值。这是我的xml:

<root>
 <time c="00:00:00">
    <title>Title</title>
    <text>Some Text...</text>
 </time>    
    <time c="00:00:01">
    <title>Title 2</title>
    <text>Some text...</text>
 </time>
</root>

这是我在节点中所做的:

xml2js = require('xml2js');
fs = require('fs');

var parser = new xml2js.Parser();
var timetag = '00:00:01';

fs.readFile( 'test.xml', function(err, data) {

    parser.parseString(data, function (err, result) {

        function sendSubs() {

            io.sockets.emit('subs', { subs: result.root.time[c=timetag].title });
        }

        setInterval(sendSubs, 1000);

    });
});

我确定那是一个语法问题,但我看不到它!它有可能获得两个孩子的名字,例如标题和文本?

问候


阅读 324

收藏
2020-07-07

共1个答案

一尘不染

使用的语法允许您浏览JSON对象的节点。但是似乎您正在尝试搜索将其视为XPath谓词。它不会工作。

使用xml2js可以time使用以下代码在代码中获取对象数组:

result.root.time

然后,循环比较该$.c值,这就是达到属性的方式。例如,第二时间元素的属性为:

result.root.time[1].$.c

这就是您需要比较字段的数据。当发现time数组位于哪个元素中时,您将得到title(实际上是一个包含标题的单元素数组),如下所示:

var resultArr = [];
for(var i = 0; i < result.root.time.length; i++) {
    if (result.root.time[i].$.c == timetag) {
       resultArr = result.root.time[i].title;
       break;
    }
 }

然后可以将其发送到套接字:

io.sockets.emit('subs', { subs: resultArr[0] });

使用JSONPath的解决方案

如果您不想在JavaScript中实现循环以比较属性值,则可以使用JSONPath。它的语法不如XPath好,但可以。您将必须通过NPM获得它,并要求:

var jsonpath = require('JSONPath');

然后,您可以title使用以下表达式获取所需的内容:

var expression = "$.root.time[?(@.$.c == '00:00:01')].title[0]";

[..]是一个谓词,?是要运行带有表达式的脚本,@.是访问属性(在xml2js对象中表示为$.c。您当然可以用timetag变量替换字符串。

要运行搜索,请使用:

var resultArr = jsonpath.eval(result, expression);

它将返回一个包含所需文本的数组。然后,您可以将其发送到任何地方:

io.sockets.emit('subs', { subs: resultArr[0] });

您可以在此处阅读有关JSONPath的更多信息:http
://goessner.net/articles/JsonPath/

2020-07-07