使用 xmlstarlet 更新现有 xml 文件元素

问题描述 投票:0回答:1

我有以下 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>

提前致谢。

奥夫佐

xml element xmlstarlet
1个回答
0
投票

您可以使用

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>
© www.soinside.com 2019 - 2024. All rights reserved.