XMLStarlet: редактирование узла с определенным значением атрибута

Я хочу отредактировать значение узла «заголовок» в следующем файле XML, используя XMLStarlet. Редактировать следует только узел заголовка, который является дочерним узлом локали с атрибутом name="de-DE".

<?xml version="1.0" encoding="UTF-8"?>
    <package xmlns="http://apple.com/itunes/importer" version="software5.4">
      <software>
        <software_metadata app_platform="ios">
          <versions>
            <version string="1.1.1">
              <locales>
                <locale name="de-DE">
                  <title>title_DE</title>
                </locale>
                <locale name="en-US">
                  <title>title_EN</title>
                </locale>
              </locales>
            </version>
          </versions>
        </software_metadata>
      </software>
    </package>

Я попробовал следующую команду, но она ничего не делает:

xml ed -N x="http://apple.com/itunes/importer" -u '/x:package/x:software/x:software_metadata/x:versions/x:version/x:locales/x:locale[@name='de-DE']/x:title' -v 'new titel' metadata.xml 

Использование того же запроса XPath для выбора работает нормально:

xml sel -N x="http://apple.com/itunes/importer" -t -v "/x:package/x:software/x:software_metadata/x:versions/x:version/x:locales/x:locale[@name='de-DE']/x:title" metadata.xml

Кто-нибудь знает, почему выбор работает, а редактирование - нет?


person Apfelsaft    schedule 29.04.2016    source источник


Ответы (1)


В вашем операторе редактирования вы также должны использовать двойные кавычки во внешнем определении. Проблема в том, что сейчас @name='de-DE', потому что одинарная кавычка завершает команду.

xml ed -N x="http://apple.com/itunes/importer" -u '/x:package/x:software/x:software_metadata/x:versions/x:version/x:locales/x:locale[@name="de-DE"]/x:title' -v 'new titel' metadata.xml

Я обычно предпочитаю сначала использовать одинарные кавычки, а внутри использовать двойные кавычки, но, поскольку оба варианта работают, это зависит от выбора, пока сохраняется согласованность.

person sebisnow    schedule 29.04.2016