我正在尝试在XML文件的现有属性下添加属性。我一直在使用xmlstarted进行编辑,但从未将其用于更新。如果有人告诉如何添加新的attr和在该新的attrb下的元素,将很有帮助-
这是我的xml文件的摘录-
这是我通常用xmlstarlet-的hel; p编辑子元素的操作
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>
之后看起来应该是这样。在这里,我在现有属性下添加了一个新属性-pass_api_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>
任何帮助/指导将不胜感激。
您可以使用一堆-i / -a / -s添加新元素(see here),但我认为将XSLT与tr
结合使用会更容易。您可以将元素放在另一个文件中,然后将其作为参数传递。
示例...
要添加的XML片段(fragment.xml)
<?xml version="1.0"?>
<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>
XSLT(test.xsl)
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output indent="yes"/>
<xsl:strip-space elements="*"/>
<xsl:param name="frag"/>
<xsl:template match="@*|node()">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
</xsl:copy>
</xsl:template>
<!--If you wanted to make this stylesheet reusable, you could pass a new
value in for the "match" attribute by selecting this template by its
"name" value (@name='target').-->
<xsl:template match="queue[@name='paas_api_q1']" name="target">
<xsl:copy>
<xsl:apply-templates select="@*|node()"/>
<xsl:copy-of select="$frag"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
xmlstarlet命令行
xmlstarlet tr test.xsl -p frag='document("fragment.xml")/*' input.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>