如何使用xmlstarlet编辑具有相似结构元素的xml文件?

时间:2016-10-21 16:04:31

标签: xml bash xmlstarlet

我正在尝试编辑看起来像这样的XML文件:

<Item>
    <rasd:AllocationUnits>hertz * 10^6</rasd:AllocationUnits>
    <rasd:Description>Number of Virtual CPUs</rasd:Description>
    <rasd:ElementName>8 virtual CPU(s)</rasd:ElementName>
    <rasd:InstanceID>1</rasd:InstanceID>
    <rasd:Reservation>18000</rasd:Reservation>
    <rasd:ResourceType>3</rasd:ResourceType>
    <rasd:VirtualQuantity>8</rasd:VirtualQuantity>
    <vmw:CoresPerSocket ovf:required="false">8</vmw:CoresPerSocket>
  </Item>
  <Item>
    <rasd:AllocationUnits>byte * 2^20</rasd:AllocationUnits>
    <rasd:Description>Memory Size</rasd:Description>
    <rasd:ElementName>8192MB of memory</rasd:ElementName>
    <rasd:InstanceID>2</rasd:InstanceID>
    <rasd:Reservation>8000</rasd:Reservation>
    <rasd:ResourceType>4</rasd:ResourceType>
    <rasd:VirtualQuantity>8192</rasd:VirtualQuantity>
  </Item>
  <Item>
    <rasd:Address>0</rasd:Address>
    <rasd:Description>SCSI Controller</rasd:Description>
    <rasd:ElementName>SCSI Controller 0</rasd:ElementName>
    <rasd:InstanceID>3</rasd:InstanceID>
    <rasd:ResourceSubType>VirtualSCSI</rasd:ResourceSubType>
    <rasd:ResourceType>6</rasd:ResourceType>
  </Item>
  <Item>
    <rasd:Address>1</rasd:Address>
    <rasd:Description>IDE Controller</rasd:Description>
    <rasd:ElementName>VirtualIDEController 1</rasd:ElementName>
    <rasd:InstanceID>4</rasd:InstanceID>
    <rasd:ResourceType>5</rasd:ResourceType>
  </Item>

包含以下内容的<item>元素内部:

<rasd:Description>Memory Size</rasd:Description>

我想编辑(或添加,如果它不存在)标题为<rasd:Reservation>的元素

我可以处理条件以确定元素是否存在或需要更改,但是我在查找如何让xmlstarlet选择正确的元素时遇到问题,当其中一些元素具有重复的名称时。

1 个答案:

答案 0 :(得分:2)

假设您的XML文件看起来像

<Items xmlns:rasd="foo" xmlns:vmw="bar" xmlns:ovf="baz">
    // your content here
</Items>

然后你可以使用do

xmlstarlet ed -N rasd=foo \
              -u '//Item[rasd:Description = "Memory Size"]/rasd:Reservation' \
              -v 12345 \
  file.xml 
相关问题