【问题标题】:Node.js Xml2js result from attributeNode.js Xml2js 来自属性的结果
【发布时间】:2014-02-25 22:39:06
【问题描述】:

我做错了什么?我无法在子属性中获取标签的值。这是我的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);

    });
});

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

问候

【问题讨论】:

    标签: javascript xml node.js


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

    【讨论】:

    • 兄弟,谢谢!真的很好的解释和工作代码!这项工作完美!
    【解决方案2】:

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

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

    可能会解决您的问题。

    【讨论】:

    • 感谢@Sumanth,这帮助我从哈希中删除了那些讨厌的 $ 元素。
    猜你喜欢
    • 2018-04-07
    • 1970-01-01
    • 2017-09-28
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-24
    • 1970-01-01
    相关资源
    最近更新 更多