如何使用 xmlstarlet 更新 xml 文件

how to update the xml file using xmlstarlet

我正在使用 windows 版本的 xmlstarlet 通过 windows 批处理文件更新 xml 文件。

xml edit --update "/xml/table/rec[@id=3]/@id" --value 10 %xmlfile%

我希望这会将 rec 节点的 id 属性更新为 10。当我 运行 这时,我在命令行中看到更新的 xml,但文件从未更新。

我该怎么做,我想避免重写整个文件,因为文件可能很大。

更新前:

<?xml version="1.0"?>
<xml>
  <table>
    <rec id="1" />
    <rec id="2" />
    <rec id="3" />
  </table>
</xml>

更新后:

<?xml version="1.0"?>
<xml>
  <table>
    <rec id="1" />
    <rec id="2" />
    <rec id="10" />
  </table>
</xml>

您没有显示您的输入文档,但我认为它是以下内容,取自 xmlstarlet documentation:

<xml>
  <table>
    <rec id="1">
      <numField>123</numField>
      <stringField>String Value</stringField>
    </rec>
    <rec id="2">
      <numField>346</numField>
      <stringField>Text Value</stringField>
    </rec>
    <rec id="3">
      <numField>-23</numField>
      <stringField>stringValue</stringField>
    </rec>
  </table>
</xml>

xmlstarlet 修改文件,但结果发送到标准输出,而不是保存在原始文件中。使用另一个选项 --inplace 就地修改文件:

$ xml ed --inplace -u "/xml/table/rec[@id='3']/@id" -v 5 rec.xml

然后:

$ cat rec.xml
<?xml version="1.0"?>
<xml>
  <table>
    <rec id="1">
      <numField>123</numField>
      <stringField>String Value</stringField>
    </rec>
    <rec id="2">
      <numField>346</numField>
      <stringField>Text Value</stringField>
    </rec>
    <rec id="5">
      <numField>-23</numField>
      <stringField>stringValue</stringField>
    </rec>
  </table>
</xml>

对了,这个问题好像问的跟this question很像。


EDIT:正如@npostavs 所建议的,此选项列在编辑帮助中:

$ xml edit --help
...
-L (or --inplace)   - edit file inplace
...