Node.js Xml2js来自属性

Ara*_*mil 9 javascript xml 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>
Run Code Online (Sandbox Code Playgroud)

这就是我在节点中所做的:

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);

    });
});
Run Code Online (Sandbox Code Playgroud)

我确定这是一个语法问题,但我没有看到它!,它可能得到两个孩子的价值,如标题和文字?

问候

hel*_*cha 15

您使用的语法允许您导航JSON对象的节点.但似乎你正试图将其视为XPath谓词.它不会起作用.

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

result.root.time
Run Code Online (Sandbox Code Playgroud)

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

result.root.time[1].$.c
Run Code Online (Sandbox Code Playgroud)

这就是比较你的领域所需的数据.当你发现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;
    }
 }
Run Code Online (Sandbox Code Playgroud)

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

io.sockets.emit('subs', { subs: resultArr[0] });
Run Code Online (Sandbox Code Playgroud)

使用JSONPath的解决方案

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

var jsonpath = require('JSONPath');
Run Code Online (Sandbox Code Playgroud)

然后你可以title用这个表达式获得你想要的东西:

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

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

要运行搜索,请使用:

var resultArr = jsonpath.eval(result, expression);
Run Code Online (Sandbox Code Playgroud)

这将返回包含所需文本的数组.然后你可以在任何你想要的地方发送它:

io.sockets.emit('subs', { subs: resultArr[0] });
Run Code Online (Sandbox Code Playgroud)

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


Sum*_*nth 5

在将XML转换为JSON时,xml2js将属性映射为'$'。如果您的属性键名与子键名不匹配。您可以将属性与子元素合并。因此,您的JSON看起来很干净。

xml2js.Parser({ignoreAttrs:false,mergeAttrs:true})

可能解决您的问题。