XMLStarlet:编辑具有特定属性值的节点

问题描述:

我想使用XMLStarlet在以下XML文件中编辑节点“title”的值。只应该编辑属性名为“de-DE”的语言环境的子节点title节点。XMLStarlet:编辑具有特定属性值的节点

<?xml version="1.0" encoding="UTF-8"?> 
    <package xmlns="http://apple.com/itunes/importer" version="software5.4"> 
     <software> 
     <software_metadata app_platform="ios"> 
      <versions> 
      <version string="1.1.1"> 
       <locales> 
       <locale name="de-DE"> 
        <title>title_DE</title> 
       </locale> 
       <locale name="en-US"> 
        <title>title_EN</title> 
       </locale> 
       </locales> 
      </version> 
      </versions> 
     </software_metadata> 
     </software> 
    </package> 

我尝试下面的命令,但不起任何作用:

xml ed -N x="http://apple.com/itunes/importer" -u '/x:package/x:software/x:software_metadata/x:versions/x:version/x:locales/x:locale[@name='de-DE']/x:title' -v 'new titel' metadata.xml 

使用用于选择的相同的XPath查询工作正常:

xml sel -N x="http://apple.com/itunes/importer" -t -v "/x:package/x:software/x:software_metadata/x:versions/x:version/x:locales/x:locale[@name='de-DE']/x:title" metadata.xml 

有谁知道为什么选择是工作,但编辑不是?

在您的编辑语句中,您还应该在外部定义中使用双引号。现在的方式是@ name ='de-DE'是问题,因为单引号结束命令。

xml ed -N x="http://apple.com/itunes/importer" -u '/x:package/x:software/x:software_metadata/x:versions/x:version/x:locales/x:locale[@name="de-DE"]/x:title' -v 'new titel' metadata.xml 

我一般偏好是第一,在里面使用双引号使用单引号,但因为两者的工作原理是高达只要选择的一致性保持。

+0

它的工作原理。谢谢。 – Apfelsaft