如何将 xml 解析为 shell 脚本的参数

如何将 xml 解析为 shell 脚本的参数

这是我的示例 xml 文件,我需要获取 max_size 作为输出吗?

我尝试使用 xlimit 和 xpath ,但都不起作用。

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-service>
   <service_info name="dummyapp" version="5.0"
   <object name="WebApplications">
      <item Location="dummyapp/ear/dummyapp.ear" name="dummy"/>
   </object>
   <object name="jdbc_oracle_nonxa">
      <item db_name="MYDB1" db_user="dummyapp_user" global_trans="None" initial_size="10" jndi_name="dummyapp-aty-ds" max_size="25" name="dummyapp-aty-ds" statement_cache_size="10"/>
</object>

答案1

假设 XML 格式良好,例如

<?xml version="1.0" encoding="UTF-8"?>
<weblogic-service>
  <service_info name="dummyapp" version="5.0"/>
  <object name="WebApplications">
    <item Location="dummyapp/ear/dummyapp.ear" name="dummy"/>
  </object>
  <object name="jdbc_oracle_nonxa">
    <item db_name="MYDB1" db_user="dummyapp_user" global_trans="None" initial_size="10" jndi_name="dummyapp-aty-ds" max_size="25" name="dummyapp-aty-ds" statement_cache_size="10"/>
  </object>
</weblogic-service>

(我已经关闭了问题中未关闭的标签)

...然后将输出以下内容25(对于本例):

xml sel -t -v '//item/@max_size' -nl file.xml

这是使用XML小星max_value获取所有节点的属性值item。最后-nl在输出后插入换行符。

如果您需要更具体,只查看节点item中的节点,其为:objectnamejdbc_oracle_nonxa

xml sel -t -v '//object[@name="jdbc_oracle_nonxa"]/item/@max_size' -nl file.xml

请注意,XMLStarlet 是作为xmlstarlet而不是安装xml在某些系统上的。


使用xmllint(输出末尾没有换行符):

xmllint --xpath 'string(//object[@name="jdbc_oracle_nonxa"]/item/@max_size)' file.xml

答案2

通常,使用 sed 或 grep 会更快,但安全性较差:

sed -E -n 's/.*max_size="([0-9]+)".*/\1/p' sample-4.xml 
25

或 grep:

grep -Eo 'max_size="[0-9]+" ' sample-4.xml | grep -Eo "[0-9]+"
25

它不会验证 xml,并且可能会在不识别的情况下选择注释代码。如果您查看屏幕并得到两个结果,您可能会注意到,但如果在自动化过程中使用它,则很容易出错。

有时您已经编写了程序,生成了 xml,因此您知道它是否会在不同的、不需要的上下文中输出注释或 max_size="..."。如果您知道这些限制,那么 sed、grep 或 awk 并没有什么问题,只是它们会妨碍您学习漂亮的 xmlstarlet 语法。 :)

相关内容