我有一个存储数据集的非常大(100+兆字节未压缩)XML文件,我正在尝试有选择地更改某些值。
例如,假设sample.xml
如下所示:
<objects>
<object>
<name>Foo</name>
<constant1>10</constant1>
<constant2>20</constant2>
</object>
<object>
<name>Bar</name>
<constant1>15</constant1>
<constant2>40</constant2>
</object>
<objects>
现在,我想将<constant1>
的值更改为18,但仅更改Name
元素的值为Foo
的对象。
我一直在讨论XML Starlet文档,但它的article on editing只有关于如何直接在树中查找元素属性的示例,除非我遗漏了某些内容......
答案 0 :(得分:12)
......显然我是个白痴;如this answer中所示,您可以像搜索属性值一样搜索元素值,因此正确的命令将是:
xmlstarlet ed -u '//object[name="Foo"]/const1' -v 18 sample.xml
...另外,在处理非常大的文件时需要注意:如果没有输出重定向,xmlstarlet
将打印到stdout。所有100多兆字节的xml。糟糕。