如何使用xmlstarlet更新xml文件

Sch*_*chu 8 xml bash xmlstarlet

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

xml edit --update "/xml/table/rec[@id=3]/@id" --value 10 %xmlfile%
Run Code Online (Sandbox Code Playgroud)

我希望这会将rec节点的id属性更新为10.当我运行它时,我在命令行中看到了预期的更新的xml,但文件永远不会更新.

我怎么能这样做,我想远离重写整个文件,因为文件可能很大.

更新前:

<?xml version="1.0"?>
<xml>
  <table>
    <rec id="1" />
    <rec id="2" />
    <rec id="3" />
  </table>
</xml>
Run Code Online (Sandbox Code Playgroud)

更新后:

<?xml version="1.0"?>
<xml>
  <table>
    <rec id="1" />
    <rec id="2" />
    <rec id="10" />
  </table>
</xml>
Run Code Online (Sandbox Code Playgroud)

Mat*_*ler 20

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

<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>
Run Code Online (Sandbox Code Playgroud)

xmlstarlet修改文件,但结果将发送到标准输出,而不是保存在原始文件中.使用其他选项--inplace来修改文件:

$ xml ed --inplace -u "/xml/table/rec[@id='3']/@id" -v 5 rec.xml
Run Code Online (Sandbox Code Playgroud)

然后:

$ 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>
Run Code Online (Sandbox Code Playgroud)

顺便说一句,这个问题似乎问了一个与这个问题非常相似的问题.


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

$ xml edit --help
...
-L (or --inplace)   - edit file inplace
...
Run Code Online (Sandbox Code Playgroud)

  • 小心命名空间。我在我的文件中定义了一个命名空间,并且必须在每个元素之前添加 `_:` 作为 [在文档中定义](http://xmlstar.sourceforge.net/doc/UG/xmlstarlet-ug.html) 在该部分`1.3. 更方便的解决方案` (2认同)