如何使用shell脚本更新特定的XML标记值?

如何使用shell脚本更新特定的XML标记值?,xml,shell,Xml,Shell,下面是XML的一部分,我想在其中使用任何所需的值更改用户名和密码 <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName"> <value>com.mysql.jdbc.Driver</value> </property> <

下面是XML的一部分,我想在其中使用任何所需的值更改
用户名
密码

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property name="url">
    <value>jdbc:mysql://x.x.x.x:3306/app
    </value>
  </property>
  <property name="username">
    <value>user1</value>
  </property>
  <property name="password">
    <value>pass1</value>
  </property>
</bean>

com.mysql.jdbc.Driver
jdbc:mysql://x.x.x.x:3306/app
用户1
通行证1
用户名
密码
属性的值(
标记)可以包含任何内容,例如
用户1
密码1
用户2
密码2
,等等。
如何在shell中使用不同的值更新这些字符串?

我认为这将对您有所帮助,您可以根据需要进行更改

if [ $# -ne 2 ];then
echo "usage: argument 1:username 2:password"
exit 1
fi
USERNAME=$1
PASSWORD=$2


echo "Change values in config.xml..."

cat <<EOF >test.xml
<bean id="dataSource"
                  class="org.springframework.jdbc.datasource.DriverManagerDataSource">
            <property name="driverClassName">
                    <value>com.mysql.jdbc.Driver</value>
            </property>
            <property name="url">
                    <value>jdbc:mysql://x.x.x.x:3306/app
                    </value>
            </property>
            <property name="username">
                    <value>${USERNAME}</value>
            </property>
            <property name="password">
                    <value>${PASSWORD}</value>
            </property>
    </bean>

 EOF
 echo "Done."
if[$#-ne 2];然后
echo“用法:参数1:用户名2:密码”
出口1
fi
用户名=$1
密码=$2
echo“更改config.xml中的值…”
cat以下命令根据XPath表达式更新
source.xml
文件中的密码值:

xmlstarlet ed --inplace \
  -u "//bean[@id='dataSource']//property[@name='password']/value" \
  -v 'new_pass' source.xml
注意,XPath表达式中的双斜杠(
/
)会从当前节点中选择与选择匹配的节点,无论它们位于何处(例如,读取)。我将其包含在表达式中,因为我怀疑您在问题中提到的XML有许多父节点

如果声明了名称空间,则应显式指定它。例如,如果根元素声明为
,则应使用
-N
全局选项指定名称空间:

xmlstarlet ed --inplace \
  -N x=http://www.springframework.org/schema/beans \
  -u "//x:bean//x:property[@name='password']/x:value" \
  -v 'new_pass' source.xml
这只是一个示例命令,可用于您在问题中发布的XML。如果您有不同的结构,请相应地调整XPath表达式

source.xml(在运行命令之前)


com.mysql.jdbc.Driver
jdbc:mysql://x.x.x.x:3306/app
用户1
通行证1
source.xml(运行命令后)


com.mysql.jdbc.Driver
jdbc:mysql://x.x.x.x:3306/app
用户1
新华通

@user3777747,你安装了xmlstarlet吗?是的,我安装了xmlstarlet@user3777747,那么它怎么会“不工作”呢?有任何错误消息吗?没有,没有任何错误消息。当我运行这个命令时,它显示xml文件的内容。但是没有找到密码的更改。@user3777747,我已经更新了我的答案。有了这个XML,命令就可以工作了。但是如果您有不同的结构,或者没有带有
id=“dataSource”
bean
标记,那么由于XPath的原因,它将无法工作。因此,如果您的XML与问题中提到的不同,您应该相应地调整XPath。请注意XPath表达式中的双斜杠。它获取id等于
dataSource
的所有bean标记。如果此标记具有父节点,则为这种情况。
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property name="url">
    <value>jdbc:mysql://x.x.x.x:3306/app
    </value>
  </property>
  <property name="username">
    <value>user1</value>
  </property>
  <property name="password">
    <value>pass1</value>
  </property>
</bean>
<?xml version="1.0"?>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  <property name="driverClassName">
    <value>com.mysql.jdbc.Driver</value>
  </property>
  <property name="url">
    <value>jdbc:mysql://x.x.x.x:3306/app
    </value>
  </property>
  <property name="username">
    <value>user1</value>
  </property>
  <property name="password">
    <value>new_pass</value>
  </property>
</bean>