xmlstarlet如何根据子元素值更新属性

时间:2016-06-30 14:48:34

标签: xml xmlstarlet

<?xml version='1.0' encoding='UTF-8'?>
<star ABC="90" ABCType="Catch" endDateTime="2020-12-30T23:59:59" startDateTime="2010-08-10T06:00:00" timePeriodInDays="1" xmlns="urn:xxx:dyn:xxx:version01">    
    <tpName>seg</tpName>
    <Instance endDateTime="2016-06-08T00:01:00"   
              startDateTime="2016-06-08T00:01:00">  
        <Id>PASS1</Id>
    </Instance>
    <Instance endDateTime="2016-06-10T00:00:00"      
              startDateTime="2016-06- 08T00:01:00">
        <Id>PASS2"</Id>
    </Instance>
</star>

我是 xmlstartlet 的新手。在上面的代码中,我尝试将 startDateTime 修改为 ID为PASS1 “AAAA”。我试着做下面的事情:

xml ed -N w=urn:xxx:dyn:xxx:version01 -u "/w:star/w:Instance[@w:startDateTime"]/@w:startDateTime" -v "AAAA" 1.xml 

但是要遵循错误

  

没有匹配的XPath;匹配默认命名空间中的节点   使用''作为前缀(参见手册中的第5.1节)。例如,   使用/ :node而不是/ node

1 个答案:

答案 0 :(得分:1)

您不需要在XPath中为属性添加前缀。

试试这个:

xml ed -N w=urn:xxx:dyn:xxx:version01 -u "/w:star/w:Instance[w:Id='PASS1']/@startDateTime" -v "AAAA" 1.xml 

输出:

<star xmlns="urn:xxx:dyn:xxx:version01" ABC="90" ABCType="Catch" endDateTime="2020-12-30T23:59:59" startDateTime="2010-08-10T06:00:00" timePeriodInDays=
"1">
  <tpName>seg</tpName>
  <Instance endDateTime="2016-06-08T00:01:00" startDateTime="AAAA">
    <Id>PASS1</Id>
  </Instance>
  <Instance endDateTime="2016-06-10T00:00:00" startDateTime="2016-06- 08T00:01:00">
    <Id>PASS2"</Id>
  </Instance>
</star>