shell Unix:如何通过CLI更新XML文件中的属性值?

2nbm6dog  于 2023-02-24  发布在  Shell
关注(0)|答案(2)|浏览(122)

我试图替换XML文件中的一行,但无法执行。我想替换此行:

<dp:request domain="@DOMAIN@">

有了这个:

<dp:request domain="export">

但是我不能。我尝试了sed命令的以下变体:
1.

sed -i -e "s/<dp:request domain="export">/<dp:request domain="@DOMAIN@">/g" file.xml
sed -i s#<dp:request domain="export">#<dp:request domain="@DOMAIN@">#g file.xml

XML文件:

<?xml version="1.0"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dp="http://www.datapower.com/schemas/management" xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <env:Body>
    <dp:request domain="@DOMAIN@">
      <dp:set-config>
        <ConfigDeploymentPolicy name="@DEPLOYMENTPOLICYNAME@">
          <ModifiedConfig>
            <Match>*/*/crypto/cert?Name=HHMM&amp;Property=Filename</Match>
            <Type>change</Type>
            <Property/>
            <Value>@HHMM.crypto.cert.FileName@</Value>
          </ModifiedConfig>
        </ConfigDeploymentPolicy>
      </dp:set-config>
    </dp:request>
  </env:Body>
</env:Envelope>
ecfsfe2w

ecfsfe2w1#

使用xmlstarletxpath查询:
$ xmlstarlet edit -N dp="http://www.datapower.com/schemas/management" \
     -u '//dp:request/@domain' -v export file.xml
输出
<?xml version="1.0"?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:dp="http://www.datapower.com/schemas/management" xmlns:fo="http://www.w3.org/1999/XSL/Format">
  <env:Body>
    <dp:request domain="export">
      <dp:set-config>
        <ConfigDeploymentPolicy name="@DEPLOYMENTPOLICYNAME@">
          <ModifiedConfig>
            <Match>*/*/crypto/cert?Name=CC_OMS_QA3&amp;Property=Filename</Match>
            <Type>change</Type>
            <Property/>
            <Value>@CC_OMS_QA3.crypto.cert.FileName@</Value>
          </ModifiedConfig>
        </ConfigDeploymentPolicy>
      </dp:set-config>
    </dp:request>
  </env:Body>
</env:Envelope>
flseospp

flseospp2#

考虑XSLT,一种转换XML文件的专用语言,它携带许多CLI processors(例如Saxon、Xalan)。下面使用Unix机器上可用的xsltproc。您可以扩展XSLT以执行 * 许多 * 其他转换,并且仍然调用单个命令行!

XSLT*(保存为.xsl文件,一种特殊的.xml文件)*

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" omit-xml-declaration="yes" indent="yes"/>
  <xsl:strip-space elements="*"/>

  <!-- IDENTITY TRANSFORM TO COPY DOC AS IS -->
  <xsl:template match="node()|@*">
     <xsl:copy>
        <xsl:apply-templates select="node()|@*"/>
     </xsl:copy>
  </xsl:template>
    
  <!-- ADJUST ALL domain ATTRIBUTES -->
  <xsl:template match="@domain">
     <xsl:attribute name="domain">export</xsl:attribute>
  </xsl:template>

</xsl:stylesheet>

Online Demo

国家牵头单位

xsltproc myScript.xsl Input.xml > Output.xml

相关问题