Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
xmlstartet shell脚本,用于在属性下添加属性和元素_Xml_Shell_Xpath_Xmlstarlet - Fatal编程技术网

xmlstartet shell脚本,用于在属性下添加属性和元素

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

我试图在XML文件中的现有属性下添加属性。我一直在使用xmlstarted进行编辑,但从未将其用于更新。如果有人告诉你如何在新属性下添加新属性和元素,会很有帮助-

以下是我的xml文件片段-

下面是我通常使用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>

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