Изменение значения элемента XML в зависимости от значения другого элемента в дереве

У меня есть очень большой (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, но в ее статье о редактировании есть только примеры того, как искать атрибуты элементов непосредственно в дереве, если я что-то не упустил...


person Shadur    schedule 12.04.2013    source источник


Ответы (1)


... видимо я идиот; Как показано в этот ответ вы можете искать значения элементов так же, как вы можете искать значения атрибутов, поэтому правильная команда будет:

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

... Кроме того, будьте осторожны при работе с действительно большими файлами: без перенаправления вывода xmlstarlet выводит на стандартный вывод. Все 100+ мегабайт xml. Упс.

person Shadur    schedule 12.04.2013
comment
Спасибо за краткое продолжение. - person seren; 03.04.2014