我有一个非常大(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文档,但它那篇关于编辑的文章中只有关于如何直接在树中查找元素属性的示例,除非我遗漏了什么……
…显然我是个白痴;正如这个答案所示,您可以像搜索属性值一样搜索元素值,因此正确的命令应该是:
xmlstarlet ed -u '//object[name="Foo"]/const1' -v 18 sample.xml
…另外,在处理非常大的文件时要注意:没有输出重定向,xmlstarlet
将打印到标准输出。所有100多兆字节的xml。哎呀。