通过命令行替换 xml 上的属性

Replace attribute on xml via command line

我正在查看这个问题 xmlstarlet update an attribute 并试图替换 Jboss 配置文件中的属性。 我post这里只是一小部分xml:

<?xml version='1.0' encoding='UTF-8'?>

<server xmlns="urn:jboss:domain:10.0">
    <extensions>
        <extension module="org.jboss.as.clustering.infinispan"/>
    </extensions>
    <system-properties>
        <property name="hibernate.hbm2ddl.auto" value="validate"/>
    </system-properties>
</server>

我想替换的是 hibernate.hbm2ddl.auto 的值从 validateupdate

根据之前的回答,我尝试了这个命令,但没有更新值:

xmlstarlet edit   --update "//property[@name='hibernate.hbm2ddl.auto']/@value"   --value "update" conf.xml

我试过完整路径,但结果是一样的:没有更新。

xmlstarlet edit   --update "/server/system-properties/property[@name='hibernate.hbm2ddl.auto']/@value"   --value "update" conf.xml

您的文件使用 namespaces (xmlns="urn:jboss:domain:10.0").

xmlstarlet edit --update '//*[local-name()="property"][@name="hibernate.hbm2ddl.auto"]/@value' -v "update" conf.xml

我使用 //*[local-name()="property"] 绕过了 conf.xml

中的所有名称空间

在 Saxon 10.0 的 Gizmo 实用程序(旨在提供与 xmlstarlet 类似的目的)中,我决定使无前缀的名称匹配任何名称空间(或 none)。所以等价于

java net.sf.saxon.Gizmo -s:conf.xml
/>update //property[@name="hibernate.hbm2ddl.auto"]/@value with "update"
/>save conf.xml
/>quit

经过多年看到人们为名称空间而苦苦挣扎之后,我开始认为使用不带前缀的名称匹配任何名称空间对用户更友好。