javascript - Node.js Xml2js 属性的结果

标签 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>

这是我在 Node 中所做的:

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

    });
});

我确定那是一个语法问题,但我没有看到它!是否有可能获得两个 child 的值,如标题和文本?

问候

最佳答案

您使用的语法允许您导航 JSON 对象的 Node 。但是您似乎正在尝试搜索将其视为 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/

关于javascript - Node.js Xml2js 属性的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22027776/

相关文章:

javascript - 配置错误 : Missing region in config when i am using amazon ses with Node. js

node.js - Mongoose:使用带有限制的 $in 运算符

javascript - javascript 服务器异步事件

javascript - LinkedIn 关注显示空白页面的公司按钮

java - 安卓 |更改溢出图标(3 点菜单)颜色?

javascript - 重定向 Javascript 时无法从同一目录加载资源

两个 iframe 连接的 Javascript

javascript - jquery :selected not working as expected

android - 为什么按钮注册和登录中的文本这么大?

xml - 如何在 Scala 类中漂亮地表示 XML 实体?