当前位置: 首页 > 面试题库 >

Node.js Xml2js来自属性的结果

汪典
2023-03-14
问题内容

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

    });
});

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

问候


问题答案:

使用的语法允许您浏览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/



 类似资料:
  • 配置类-根据活动配置文件创建bean: 这个很管用。但是,当我删除application.yml并通过Spring Cloud Config-with Git repository使用外部配置时,这就不起作用了。活动配置文件仅为prod,不包括“enable_tls”和“enable_mongo_ssl”,因此在bean创建时,语句: 不再是真的了。 我当前的解决方案是将所有属性都外部化在配置服务

  • 您可以用Spring以各种方式创建-对象。 一种方法是将-注释添加到-声明中,如下所示: 它将从-类创建一个bean,然后使用其setter用配置文件中的值填充其成员。 您也可以直接在-Object上进行注释,如下所示: 通过将放置到任何加载的配置来创建它。 还可以使用 但是如何结合第一个@Bean方法创建不可变的ConfigurationProperties呢? 我尝试过这样的东西: 它告诉我,

  • 我的Spring boot应用程序中有以下文件应用程序属性文件。所有属性文件都位于src/main/resources文件夹中,Spring boot版本为2.1.6 application.propertiesapplication-dev.propertiesapplication-tst.properties 应用属性应用。name={app.name}app。common=common v

  • 问题内容: 我提供了带有几个命令和子命令的命令行工具,我使用了cobra命令行,并且我有两个 单独的命令 ,第一个是其他 命令的 先决条件 例如,第一个命令是通过创建临时文件夹并验证某些文件来选择环境 第二个命令应该从第一个命令获得一些属性 用户应该像这样执行它 btr准备 btr运行 当执行时,它应该从命令结果中获取一些数据 更新 好吧,下面的答案并没有真正的帮助。我需要在 本地和云环境中的 两

  • 我有两张桌子。与文章编号相关的图像。还有一张照片上有文章编号 我想要做的是列出第一个表中的所有图像(navn)(它是一个特定的文章编号(art_id))和第二个表中的最多5个图像(其中文章编号(artid)出现在照片(fotostation)上)。 (我现在不知道该怎么做:) 这不起作用 表格: 这些表与fotostation字段相关。要在“ECS_article_images_inneholde