【发布时间】:2021-12-24 23:01:36
【问题描述】:
我正在尝试比较两个 xml 文件并仅将某个键更新为新文件。当我导出 zabbix 模板并尝试在另一个环境中导入时会出现此问题,状态应保留为目标之一。假设我有两个 xml 文件,
source.xml
<zabbix_export>
<version>5.0</version>
<groups>
<group>
<name>zabbix</name>
</group>
</groups>
<templates>
<template>
<template>testtemp</template>
<name>testtemp</name>
<groups>
<group>
<name>zabbix</name>
</group>
</groups>
<items>
<item>
<name>test1</name>
<key>kernel.maxproc</key>
<triggers>
<trigger>
<expression>{last()}=0</expression>
<name>testtrig1</name>
</trigger>
<trigger>
<expression>{last()}=100</expression>
<name>testtrig2</name>
</trigger>
</triggers>
</item>
</items>
</template>
</templates>
</zabbix_export>
destination.xml
<version>5.0</version>
<groups>
<group>
<name> zabbix </name>
</group>
</groups>
<templates>
<template>
<template>testtemp</template>
<name>testtemp</name>
<groups>
<group>
<name>zabbix</name>
</group>
</groups>
<items>
<item>
<name>test1</name>
<key>kernel.maxproc</key>
<triggers>
<trigger>
<expression>{last()}=0</expression>
<name>testtrig1</name>
<status>DISABLED</status>
</trigger>
</triggers>
</item>
</items>
</template>
</templates>
</zabbix_export>
所以我的目标是创建一个新文件并将键/值“禁用”如下。
final.xml
<zabbix_export>
<version>5.0</version>
<groups>
<group>
<name>zabbix</name>
</group>
</groups>
<templates>
<template>
<template>testtemp</template>
<name>testtemp</name>
<groups>
<group>
<name>zabbix</name>
</group>
</groups>
<items>
<item>
<name>test1</name>
<key>kernel.maxproc</key>
<triggers>
<trigger>
<expression>{last()}=0</expression>
<name>testtrig1</name>
<status>DISABLED</status>
</trigger>
<trigger>
<expression>{last()}=100</expression>
<name>testtrig2</name>
</trigger>
</triggers>
</item>
</items>
</template>
</templates>
</zabbix_export>
我在Updating two xml file using xmlstarlet 帖子上找到了实现此行为的最接近的方法之一,但仍需要稍作改动。所以使用 'xmlstarlet' 似乎更好,因为我需要在 Debian 本地运行这个宝贝。
至少能提供一个线索如何以这种方式使用它会很棒。
提前致谢,
【问题讨论】:
-
destination.xml不是 XML,除非您在文件开头插入<zabbix_export>。在final.xml//group[1]/name来自source.xml但//trigger[1]来自destination.xml;解释?你尝试了什么xmlstarlet 命令? -
两个xml之间的唯一区别是
<status>DISABLED</status>标签,所以我只想将此标签插入final.xml,如果目的地有它。 -
如果destination和final之间的唯一区别是final有
<status>DISABLED</status>,为什么不检查destination是否有标签,如果有,就使用destination作为final(即复制目的地并将其称为“最终”)? -
视情况而定。问题是我必须为某些上键插入
<status>DISABLED</status>,在这种情况下,对于名为<name>testtrig1</name>但所有其他<trigger>的触发器。所以也需要弄清楚delta。 -
基本上,如果触发器在目标上但在源中被禁用,则 final.xml 也应为所涉及的触发器禁用。
标签: xml zabbix xmlstarlet xmlupdate