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

时间:2016-10-14 06:19:40

标签: xml shell

以下是XML的一部分,我希望将usernamepassword更改为任何所需的值。

<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>

<value>username属性的值(password标记)可能包含任何内容,例如user1pass1user2pass2等 如何在shell中使用不同的值更新这些字符串?

2 个答案:

答案 0 :(得分:0)

我认为这会对你有帮助,你可以改变你想要的;

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."

答案 1 :(得分:0)

以下xmlstarlet命令根据XPath表达式更新source.xml文件中的密码值:

xmlstarlet ed --inplace \
  -u "//bean[@id='dataSource']//property[@name='password']/value" \
  -v 'new_pass' source.xml

注意,XPath表达式中的双斜杠(//)从当前节点中选择与选择匹配的文档中的节点,无论它们在何处(读取this,例如)。我已将其包含在表达式中,因为我怀疑您在问题中提到的XML有许多父节点。

如果声明了名称空间,则应明确指定它。例如,如果根元素声明为<beans xmlns="http://www.springframework.org/schema/beans">,那么您应该使用-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 (在运行命令之前)

<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>

source.xml (运行命令后)

<?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>
相关问题