使用xmlstarlet匹配XML节点属性并更新同节点兄弟属性
修改指定MAC地址对应接口的link状态属性
现有XML文件(mg.xml)
<?xml version="1.0"?> <domain type="kvm"> <name>Comus</name> <devices> <interface type="network"> <mac address="52:54:00:46:a3:25"/> <source network="default"/> <model type="virtio"/> <link state="down"/> <address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/> </interface> <interface type="bridge"> <mac address="52:54:00:6c:0e:d0"/> <source bridge="br0"/> <model type="virtio"/> <link state="up"/> <address type="pci" domain="0x0000" bus="0x07" slot="0x00" function="0x0"/> </interface> </devices> </domain>
需求
找到MAC地址为52:54:00:46:a3:25的<interface>节点,将其下<link>元素的state属性值更新为up。
错误的尝试命令
xmlstarlet edit -L -u "/domain/devices/interface/mac[@address='52:54:00:6c:0e:d0']/@address" -v "up" mg.xml
该命令存在两个问题:
- 错误定位到了
<mac>元素的address属性,而非目标<link>的state属性 - 匹配的MAC地址是另一个接口的,并非需求中指定的
52:54:00:46:a3:25
正确的xmlstarlet命令
xmlstarlet edit -L -u "/domain/devices/interface[mac/@address='52:54:00:46:a3:25']/link/@state" -v "up" mg.xml
命令说明
-L:直接在原文件上修改(原地编辑)-u:指定需要更新的节点路径,通过interface[mac/@address='xxx']筛选出包含目标MAC的接口节点,再定位到其下<link>元素的state属性-v "up":将目标属性的值设置为upmg.xml:待处理的XML文件
执行后预期结果
<?xml version="1.0"?> <domain type="kvm"> <name>Comus</name> <devices> <interface type="network"> <mac address="52:54:00:46:a3:25"/> <source network="default"/> <model type="virtio"/> <link state="up"/> <address type="pci" domain="0x0000" bus="0x01" slot="0x00" function="0x0"/> </interface> <interface type="bridge"> <mac address="52:54:00:6c:0e:d0"/> <source bridge="br0"/> <model type="virtio"/> <link state="up"/> <address type="pci" domain="0x0000" bus="0x07" slot="0x00" function="0x0"/> </interface> </devices> </domain>
内容的提问来源于stack exchange,提问作者Mark Grant
相关产品推荐
相关产品推荐

