xmlstartet shell脚本,用于在属性下添加属性和元素
我试图在XML文件中的现有属性下添加属性。我一直在使用xmlstarted进行编辑,但从未将其用于更新。如果有人告诉你如何在新属性下添加新属性和元素,会很有帮助- 以下是我的xml文件片段- 下面是我通常使用hel编辑子元素的步骤;小星星的p-xmlstartet shell脚本,用于在属性下添加属性和元素,xml,shell,xpath,xmlstarlet,Xml,Shell,Xpath,Xmlstarlet,我试图在XML文件中的现有属性下添加属性。我一直在使用xmlstarted进行编辑,但从未将其用于更新。如果有人告诉你如何在新属性下添加新属性和元素,会很有帮助- 以下是我的xml文件片段- 下面是我通常使用hel编辑子元素的步骤;小星星的p- xmlstarlet edit --inplace -u "/allocations/queue[@name='root']/queue[@name='paas_api_q1']/queue[@name='child1_sq1']/minResourc
xmlstarlet edit --inplace -u "/allocations/queue[@name='root']/queue[@name='paas_api_q1']/queue[@name='child1_sq1']/minResources" --value "$value" myfile.xml
在—
<?xml version="1.0"?>
<allocations>
<queue name="root">
<aclSubmitApps> bddbagrp,mapr</aclSubmitApps>
<aclAdministerApps> bddbagrp,root,mapr,trmte_id</aclAdministerApps>
<schedulingPolicy>drf</schedulingPolicy>
<defaultMinSharePreemptionTimeout>60</defaultMinSharePreemptionTimeout>
<fairSharePreemptionTimeout>60</fairSharePreemptionTimeout>
<queue name="paas_api_q1">
<minResources>90000 mb,15 vcores,2 disks</minResources>
<maxResources>135000 mb,22 vcores,3 disks</maxResources>
<queue name="child1_sq1">
<minResources>66000 mb,11 vcores,2 disks</minResources>
<maxResources>264000 mb,44 vcores,8 disks</maxResources>
<aclSubmitApps> paas_opsauto_admin_unix</aclSubmitApps>
<aclAdministerApps> paas_opsauto_admin_unix</aclAdministerApps>
<label>allnodes||balanced</label>
</queue>
</queue>
</queue>
<queuePlacementPolicy>
<rule create="false" name="specified"/>
<rule name="reject"/>
</queuePlacementPolicy>
</allocations>
bddbagrp,mapr
bddbagrp,根,映射,trmte_id
drf
60
60
90000 mb,15个vCore,2个磁盘
135000 mb,22个vCore,3个磁盘
66000 mb,11个vCore,2个磁盘
264000 mb,44个vCore,8个磁盘
paas_opsauto_admin_unix
paas_opsauto_admin_unix
所有节点| |平衡
之后应该是这样的。。在这里,我在现有attr-pass\u api\u q1下添加了一个新属性
<!-- language: lang-xml -->
<?xml version="1.0"?>
<allocations>
<queue name="root">
<aclSubmitApps> bddbagrp,mapr</aclSubmitApps>
<aclAdministerApps> bddbagrp,root,mapr,trmte_id</aclAdministerApps>
<schedulingPolicy>drf</schedulingPolicy>
<defaultMinSharePreemptionTimeout>60</defaultMinSharePreemptionTimeout>
<fairSharePreemptionTimeout>60</fairSharePreemptionTimeout>
<queue name="paas_api_q1">
<minResources>90000 mb,15 vcores,2 disks</minResources>
<maxResources>135000 mb,22 vcores,3 disks</maxResources>
<queue name="child1_sq1">
<minResources>66000 mb,11 vcores,2 disks</minResources>
<maxResources>264000 mb,44 vcores,8 disks</maxResources>
<aclSubmitApps> paas_opsauto_admin_unix</aclSubmitApps>
<aclAdministerApps> paas_opsauto_admin_unix</aclAdministerApps>
<label>allnodes||balanced</label>
</queue>
<queue name="child2_sq1">
<minResources>66000 mb,11 vcores,2 disks</minResources>
<maxResources>132000 mb,22 vcores,4 disks</maxResources>
<aclSubmitApps> paas_opsauto_admin_unix</aclSubmitApps>
<aclAdministerApps> paas_opsauto_admin_unix</aclAdministerApps>
<label>allnodes||balanced</label>
</queue>
</queue>
</queue>
<queuePlacementPolicy>
<rule create="false" name="specified"/>
<rule name="reject"/>
</queuePlacementPolicy>
</allocations>
bddbagrp,mapr
bddbagrp,根,映射,trmte_id
drf
60
60
90000 mb,15个vCore,2个磁盘
135000 mb,22个vCore,3个磁盘
66000 mb,11个vCore,2个磁盘
264000 mb,44个vCore,8个磁盘
paas_opsauto_admin_unix
paas_opsauto_admin_unix
所有节点| |平衡
66000 mb,11个vCore,2个磁盘
132000 mb,22个vCore,4个磁盘
paas_opsauto_admin_unix
paas_opsauto_admin_unix
所有节点| |平衡
任何帮助/指导都将不胜感激 您可以使用一堆-i/-a/-s来添加新元素(),但我认为将XSLT与tr
结合使用会更容易。您可以将元素放在另一个文件中,并将其作为参数传入
例如
要添加的XML片段(fragment.XML)
输出
<?xml version="1.0"?>
<allocations>
<queue name="root">
<aclSubmitApps> bddbagrp,mapr</aclSubmitApps>
<aclAdministerApps> bddbagrp,root,mapr,trmte_id</aclAdministerApps>
<schedulingPolicy>drf</schedulingPolicy>
<defaultMinSharePreemptionTimeout>60</defaultMinSharePreemptionTimeout>
<fairSharePreemptionTimeout>60</fairSharePreemptionTimeout>
<queue name="paas_api_q1">
<minResources>90000 mb,15 vcores,2 disks</minResources>
<maxResources>135000 mb,22 vcores,3 disks</maxResources>
<queue name="child1_sq1">
<minResources>66000 mb,11 vcores,2 disks</minResources>
<maxResources>264000 mb,44 vcores,8 disks</maxResources>
<aclSubmitApps> paas_opsauto_admin_unix</aclSubmitApps>
<aclAdministerApps> paas_opsauto_admin_unix</aclAdministerApps>
<label>allnodes||balanced</label>
</queue>
<queue name="child2_sq1">
<minResources>66000 mb,11 vcores,2 disks</minResources>
<maxResources>132000 mb,22 vcores,4 disks</maxResources>
<aclSubmitApps> paas_opsauto_admin_unix</aclSubmitApps>
<aclAdministerApps> paas_opsauto_admin_unix</aclAdministerApps>
<label>allnodes||balanced</label>
</queue>
</queue>
</queue>
<queuePlacementPolicy>
<rule create="false" name="specified"/>
<rule name="reject"/>
</queuePlacementPolicy>
</allocations>
bddbagrp,mapr
bddbagrp,根,映射,trmte_id
drf
60
60
90000 mb,15个vCore,2个磁盘
135000 mb,22个vCore,3个磁盘
66000 mb,11个vCore,2个磁盘
264000 mb,44个vCore,8个磁盘
paas_opsauto_admin_unix
paas_opsauto_admin_unix
所有节点| |平衡
66000 mb,11个vCore,2个磁盘
132000 mb,22个vCore,4个磁盘
paas_opsauto_admin_unix
paas_opsauto_admin_unix
所有节点| |平衡
您可以使用一堆-i/-a/-s来添加新元素(),但我认为将XSLT与tr
一起使用会更容易。您可以将元素放在另一个文件中,并将其作为参数传入
例如
要添加的XML片段(fragment.XML)
输出
<?xml version="1.0"?>
<allocations>
<queue name="root">
<aclSubmitApps> bddbagrp,mapr</aclSubmitApps>
<aclAdministerApps> bddbagrp,root,mapr,trmte_id</aclAdministerApps>
<schedulingPolicy>drf</schedulingPolicy>
<defaultMinSharePreemptionTimeout>60</defaultMinSharePreemptionTimeout>
<fairSharePreemptionTimeout>60</fairSharePreemptionTimeout>
<queue name="paas_api_q1">
<minResources>90000 mb,15 vcores,2 disks</minResources>
<maxResources>135000 mb,22 vcores,3 disks</maxResources>
<queue name="child1_sq1">
<minResources>66000 mb,11 vcores,2 disks</minResources>
<maxResources>264000 mb,44 vcores,8 disks</maxResources>
<aclSubmitApps> paas_opsauto_admin_unix</aclSubmitApps>
<aclAdministerApps> paas_opsauto_admin_unix</aclAdministerApps>
<label>allnodes||balanced</label>
</queue>
<queue name="child2_sq1">
<minResources>66000 mb,11 vcores,2 disks</minResources>
<maxResources>132000 mb,22 vcores,4 disks</maxResources>
<aclSubmitApps> paas_opsauto_admin_unix</aclSubmitApps>
<aclAdministerApps> paas_opsauto_admin_unix</aclAdministerApps>
<label>allnodes||balanced</label>
</queue>
</queue>
</queue>
<queuePlacementPolicy>
<rule create="false" name="specified"/>
<rule name="reject"/>
</queuePlacementPolicy>
</allocations>
bddbagrp,mapr
bddbagrp,根,映射,trmte_id
drf
60
60
90000 mb,15个vCore,2个磁盘
135000 mb,22个vCore,3个磁盘
66000 mb,11个vCore,2个磁盘
264000 mb,44个vCore,8个磁盘
paas_opsauto_admin_unix
paas_opsauto_admin_unix
所有节点| |平衡
66000 mb,11个vCore,2个磁盘
132000 mb,22个vCore,4个磁盘
paas_opsauto_admin_unix
paas_opsauto_admin_unix
所有节点| |平衡
正如Daniel Haley指出的那样,专门使用xmlstarlet可能会很乏味,因为它没有复制/粘贴功能,而复制/粘贴功能会使任务简单得多。作为练习,我尝试了下面的代码,这似乎很有效:
xmlstarlet ed
-a "//queue/queue[@name='paas_api_q1']/queue"
-t elem -n queue -v "$(xmlstarlet sel -t -m //queue/queue[@name]/*/* -c . myfile.xml)"
-i "//queue[@name='paas_api_q1']//queue[not(@name)]" --type attr --name "name" -v "child2_sq1" \
myfile.xml | xmlstarlet unesc
基本上,它在适当的位置创建一个新节点,创建原始节点的副本(使用变量),将副本插入新节点的值中,向新节点添加属性和值,最后从原始节点的副本中取消标记
就像我说的,只是一个练习
虽然我还没有尝试过,但我想这项任务也可以使用xidel及其对xquery的支持来代替xmlstarlet来执行。正如Daniel Haley指出的那样,专门使用xmlstarlet可能会很乏味,因为它没有复制/粘贴功能,这会使任务变得更简单。作为练习,我尝试了下面的代码,这似乎很有效:
xmlstarlet ed
-a "//queue/queue[@name='paas_api_q1']/queue"
-t elem -n queue -v "$(xmlstarlet sel -t -m //queue/queue[@name]/*/* -c . myfile.xml)"
-i "//queue[@name='paas_api_q1']//queue[not(@name)]" --type attr --name "name" -v "child2_sq1" \
myfile.xml | xmlstarlet unesc
基本上,它在适当的位置创建一个新节点,创建原始节点的副本(使用变量),将副本插入新节点的值中,向新节点添加属性和值,最后从原始节点的副本中取消标记
就像我说的,只是一个练习
虽然我还没有尝试过,但我想也可以使用xidel及其对xquery的支持来代替xmlstarlet来执行此任务。将您自己的代码添加到您的问题中。看起来您添加了一个新的
节点,它与前面的节点(包括子节点)相同除了它有一个名称
属性和一个“child2_sq1”
值,而上一个节点的属性值是“child1_sq1”
。这就是目的吗?是的。。这是正确的将您自己的代码添加到问题中。看起来您添加了一个新的
节点,该节点与前面的节点(包括子节点)相同,只是它有一个名称属性,该属性具有“child2_sq1”
值,而上一个节点的属性值是“child1_sq1”
。这就是目的吗?是的。。没错
xmlstarlet ed
-a "//queue/queue[@name='paas_api_q1']/queue"
-t elem -n queue -v "$(xmlstarlet sel -t -m //queue/queue[@name]/*/* -c . myfile.xml)"
-i "//queue[@name='paas_api_q1']//queue[not(@name)]" --type attr --name "name" -v "child2_sq1" \
myfile.xml | xmlstarlet unesc