![如何将 xml 解析为 shell 脚本的参数](https://linux22.com/image/128479/%E5%A6%82%E4%BD%95%E5%B0%86%20xml%20%E8%A7%A3%E6%9E%90%E4%B8%BA%20shell%20%E8%84%9A%E6%9C%AC%E7%9A%84%E5%8F%82%E6%95%B0.png)
这是我的示例 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
中的节点,其为:object
name
jdbc_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 语法。 :)