首页 > 解决方案 > Node-Red:通过属性值访问 XML 节点

问题描述

我使用 Node-Red 来查询返回 XML 长度的状态列表。它基本上来自我的 Homematic 家庭自动化中央单元,即传感器值和状态。

现在我正在专门查询每个传感器,但还有一个功能可以一次获取所有内容,这对我来说看起来更经济,因为无论如何我都需要多个值。

但是,我不知道是否可以保证这些值始终位于同一位置。

XML 如下所示:

中央单位提供的 XML

在 Node-Red 调试窗口中,我可以看到如下结构:

红色节点中的 XML

我知道如何单独访问每个节点,但如果我使用复制路径方法:

payload.state.device[0].channel[1].datapoint[0].$.value

如果中央单元中的 API 将来更改顺序(也许如果我添加另一个 / 删除 / 重新连接传感器?),那最终会爆炸。

每个 Sensor 都有自己的 ID,您可以将其视为

<device name="Fenster Bad" ise_id="3416" unreach="false" config_pending="false">

设备节点中的 ise_id 属性。

现在的问题:

我正在尝试访问以蓝色突出显示的值。我可以使用不同的 ise_ids(高亮红色)到达那里。

XML 并突出显示我想要的

但是我如何告诉节点 Red 不要通过索引而是通过属性 ise_id 沿着路径走?

就像是:

payload.state.device['ise_id=3416'].channel[1].datapoint[0].$.value

但是我在网上找不到任何明确这样做的线程或教程......

请在此处找到示例 XML:

https://pastebin.com/ic4eDXpp

标签: node-red

解决方案


一个可能的解决方案:

在此处输入图像描述

xml 节点会将 XML 文件转换为 JavaScript 对象。以下节点,即配置有jsonata表达式的更改节点,将仅过滤所需的数据ise_id,无论它在对象(或 xml)结构中的什么位置。

您可以在此链接中了解有关 jsonata 的更多信息:https ://docs.jsonata.org/overview

您可能想专门阅读有关以下内容的页面Predicate querieshttps ://docs.jsonata.org/predicate

无论如何,我很乐意澄清任何问题。此外,您可以在Node-RED 论坛中找到大量 jsonata 示例(或提问)

节点红色流:

[{"id":"d4dde310.a8375","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"968c62d.36b67a","type":"inject","z":"d4dde310.a8375","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":160,"y":120,"wires":[["37118c19.2fd204"]]},{"id":"37118c19.2fd204","type":"file in","z":"d4dde310.a8375","name":"Read XML file","filename":"C:\\Users\\OCM\\.node-red\\static\\nrfiles\\s1.xml","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":340,"y":120,"wires":[["a493ccb.367ae3"]]},{"id":"76cd1e5e.a132f","type":"debug","z":"d4dde310.a8375","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"filter","targetType":"msg","x":780,"y":120,"wires":[]},{"id":"a493ccb.367ae3","type":"xml","z":"d4dde310.a8375","name":"","property":"payload","attr":"","chr":"","x":490,"y":120,"wires":[["70d00d31.6dd424","e7614ac8.183a78"]]},{"id":"70d00d31.6dd424","type":"change","z":"d4dde310.a8375","name":"","rules":[{"t":"set","p":"filter","pt":"msg","to":"payload.**[ise_id = '3418']","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":630,"y":120,"wires":[["76cd1e5e.a132f"]]},{"id":"e7614ac8.183a78","type":"debug","z":"d4dde310.a8375","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":630,"y":200,"wires":[]}]

过滤后的输出 ise_id = '3418' (例如):

在此处输入图像描述


推荐阅读