根据树中另一个元素的值更改XML元素的值

时间:2013-04-12 12:00:25

标签: xml xmlstarlet

我有一个存储数据集的非常大(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只有关于如何直接在树中查找元素属性的示例,除非我遗漏了某些内容......

1 个答案:

答案 0 :(得分:12)

......显然我是个白痴;如this answer中所示,您可以像搜索属性值一样搜索元素值,因此正确的命令将是:

xmlstarlet ed -u '//object[name="Foo"]/const1' -v 18 sample.xml

...另外,在处理非常大的文件时需要注意:如果没有输出重定向,xmlstarlet将打印到stdout。所有100多兆字节的xml。糟糕。