将 xml 解析为并替换特定标签的 shell 脚本 [英] Parsing xml to and replacing specific tags shell script
问题描述
对于下面的 xml,我需要将
的
替换为
For the below xml ,I need to replace <studentStatus>
for <studentName>CLASSA</studentName>
to <studentStatus>failed</studentStatus>
.
<studentFile>
<student>
<studentName>CLASSA</studentName>
<studentStatus>Success</studentStatus>
<studentActions>
<studentAction>
<studentType>Juniour</studentType>
<studentStatus>Completed</studentStatus>
<studentMsg/>
</studentAction>
<studentAction>
<studentType>HighSchool</studentType>
<studentStatus>Completed</studentStatus>
<studentMsg/>
</studentAction>
</studentActions>
</student>
<student>
<studentName>CLASSB</studentName>
<studentStatus>Success</studentStatus>
<studentActions>
<studentAction>
<studentType>Senior</studentType>
<studentStatus>Completed</studentStatus>
</studentAction>
<studentAction>
<studentType>Middle</studentType>
<studentStatus>Completed</studentStatus>
</studentAction>
</studentActions>
</student>
</studentFile>
到目前为止,我得到了什么,
What I got so far,
xmllint -xpath "/studentFile/student[studentName='CLASSA']/studentActions/studentAction[studentType="Juniour"]/studentStatus" myxml.xml
现在我的学生状态为 Completed ,现在该值应更改为 Failed .仅适用于 <studentType>Juniour</studentType>
.我应该如何编辑 xml 以将其作为 ,
now i got the status of the student as Completed , now this value should be changed to Failed . Only for <studentType>Juniour</studentType>
.
How should I edit the xml inorder to get it as ,
<studentFile>
<student>
<studentName>CLASSA</studentName>
<studentStatus>Success</studentStatus>
<studentActions>
<studentAction>
<studentType>Juniour</studentType>
<studentStatus>Failed</studentStatus>
<studentMsg/>
</studentAction>
<studentAction>
<studentType>HighSchool</studentType>
<studentStatus>Completed</studentStatus>
<studentMsg/>
</studentAction>
</studentActions>
</student>
<student>
<studentName>CLASSB</studentName>
<studentStatus>Success</studentStatus>
<studentActions>
<studentAction>
<studentType>Senior</studentType>
<studentStatus>Completed</studentStatus>
</studentAction>
<studentAction>
<studentType>Middle</studentType>
<studentStatus>Completed</studentStatus>
</studentAction>
</studentActions>
</student>
</studentFile>
这可以使用 sed 来完成吗?我知道有像 xsltproc 这样的工具,但不确定它是否安装在我们集群的所有节点中.
Can this be done using sed. I know there are tools like xsltproc but not sure if this is installed in all nodes in our cluster .
任何帮助将不胜感激.提前致谢!
Any help will be appreciated. Thanks in advance!
推荐答案
用 file.xml
中的 xmllint
更新值:
Update value with xmllint
in file.xml
:
xmllint --shell file.xml << EOF
cd /studentFile/student[studentName='CLASSA']/studentActions/studentAction[studentType='Juniour']/studentStatus
set failed
save
EOF
或者没有这里文档:
echo -e "cd /studentFile/student[studentName='CLASSA']/studentActions/studentAction[studentType='Juniour']/studentStatus
set failed
save" | xmllint --shell file.xml
<小时>
更新:在变量中使用 bash 和 XML:
Update: With bash and XML in a variable:
xml=$(xmllint --shell <(echo "$xml") << EOF
cd /studentFile/student[studentName='CLASSA']/studentActions/studentAction[studentType='Juniour']/studentStatus
set failed
save -
EOF
)
或者没有这里文档:
xml=$(echo -e "cd /studentFile/student[studentName='CLASSA']/studentActions/studentAction[studentType='Juniour']/studentStatus
set failed
save -" | xmllint --shell <(echo "$xml"))
这篇关于将 xml 解析为并替换特定标签的 shell 脚本的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!