我有以下 xml 文件:
<?xml version="1.0" encoding="UTF-8"?>
<sec>
<NewTempP>xxx</NewTempP>
<fig>
<label></label>
<caption>
<p/>
</caption>
<graphic/>
</fig>
<NewTempP>aaaa</NewTempP>
<fig>
<label></label>
<caption>
<p/>
</caption>
<graphic/>
</fig>
<NewTempP>zzzz</NewTempP>
<fig>
<label></label>
<caption>
<p/>
</caption>
<graphic/>
</fig>
....
</sec>
我在 bash 脚本中编写了 xmlstarlet,该脚本迭代 XML 文件中的每个
<NewTempP>
元素,检查它是否有紧随其后的同级 <fig>
和子元素 <label>
,如果是,则复制 <NewTempP>
的内容
对应的<label>
:
#!/bin/bash
# Path to your XML file
xmlfile="test.xml"
# Iterate over each <NewTempP> element
xmlstarlet sel -t -c "/sec/NewTempP" "$xmlfile" | while read -r newTempP; do
# Extract the content of <NewTempP>
content=$(echo "$newTempP" | xmlstarlet sel -t -v ".")
# Check if there's an immediate following sibling <fig> with a child <label>
figLabel=$(echo "$newTempP" | xmlstarlet sel -t -v "following-sibling::fig/label")
if [ -n "$figLabel" ]; then
# Update the <label> element with the content of <NewTempP>
xmlstarlet ed - L --inplace -u "following-sibling::fig/label" -v "$content" "$xmlfile"
fi
done
脚本不更新
<label>
并且没有任何错误消息。怎么了?结果应该是:
<?xml version="1.0" encoding="UTF-8"?>
<sec>
<NewTempP>xxx</NewTempP>
<fig>
<label>xxx</label>
<caption>
<p/>
</caption>
<graphic/>
</fig>
<NewTempP>aaaa</NewTempP>
<fig>
<label>aaaa</label>
<caption>
<p/>
</caption>
<graphic/>
</fig>
<NewTempP>zzzz</NewTempP>
<fig>
<label>zzzz</label>
<caption>
<p/>
</caption>
<graphic/>
</fig>
....
</sec>
提前致谢。
奥夫佐
您可以使用
ed
(编辑)命令通过 xmlstarlet 中的 xpath 来完成此操作...
命令行:
xmlstarlet ed -P -u "//fig[preceding-sibling::node()[1]]/label" -x "string(../preceding-sibling::NewTempP[1])" test.xml
输出:
<?xml version="1.0"?>
<sec>
<NewTempP>xxx</NewTempP>
<fig>
<label>xxx</label>
<caption>
<p/>
</caption>
<graphic/>
</fig>
<NewTempP>aaaa</NewTempP>
<fig>
<label>aaaa</label>
<caption>
<p/>
</caption>
<graphic/>
</fig>
<NewTempP>zzzz</NewTempP>
<fig>
<label>zzzz</label>
<caption>
<p/>
</caption>
<graphic/>
</fig>
....
</sec>