xmlstarlet не обновлять содержимое

У меня проблемы с обновлением следующего XML-файла.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<config xmlns="http://artifactory.jfrog.org/xsd/2.0.5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jfrog.org/xsd/artifactory-v2_0_5.xsd">
  <serverName>DGI-Artifactory</serverName>
  <offlineMode>false</offlineMode>
  <helpLinksEnabled>true</helpLinksEnabled>
  <fileUploadMaxSizeMb>2000</fileUploadMaxSizeMb>
  <dateFormat>dd-MM-yy HH:mm:ss z</dateFormat>
  <addons>
    <showAddonsInfo>true</showAddonsInfo>
    <showAddonsInfoCookie>1413295590171</showAddonsInfoCookie>
  </addons>
  <mailServer>
    <enabled>true</enabled>
    <host>smtp.base.dom</host>
    <port>25</port>
    <username/>
    <password/>
    <subjectPrefix>[Artifactory Prod - NPM]</subjectPrefix>
    <tls>false</tls>
    <ssl>false</ssl>
    <artifactoryUrl>https://artifactory.groupxx.net/artifactory</artifactoryUrl>
  </mailServer>
  <bintrayConfig>
    <fileUploadLimit>0</fileUploadLimit>
  </bintrayConfig>
  <security>
    <anonAccessEnabled>true</anonAccessEnabled>
    <anonAccessToBuildInfosDisabled>false</anonAccessToBuildInfosDisabled>
    <hideUnauthorizedResources>false</hideUnauthorizedResources>
    <passwordSettings>
      <encryptionPolicy>supported</encryptionPolicy>
      <expirationPolicy>
        <enabled>false</enabled>
        <passwordMaxAge>60</passwordMaxAge>
        <notifyByEmail>true</notifyByEmail>
      </expirationPolicy>
      <resetPolicy>
        <enabled>true</enabled>
        <maxAttemptsPerAddress>3</maxAttemptsPerAddress>
        <timeToBlockInMinutes>60</timeToBlockInMinutes>
      </resetPolicy>
    </passwordSettings>...

Я хочу изменить следующее значение на 5

<maxAttemptsPerAddress>3</maxAttemptsPerAddress>

После прочтения большого количества документации, включая несколько сообщений о stackoverflow, похожих на эту.

и пробуя десятки команд и вариантов, подобных этой:

xmlstarlet ed --inplace -u '/config/security/passwordSettings/expirationPolicy/resetPolicy/maxAttemptsPerAddress' -v 5 test.xml

xmlstarlet ed --inplace -u /config[@xmlns=*][@xmlns:xsi=*][@xsi:schemaLocation=*]/security/passwordSettings/expirationPolicy/resetPolicy/maxAttemptsPerAddress -v 5 test.xml

xmlstarlet ed --inplace -u /config[@xmlns="http://artifactory.jfrog.org/xsd/2.0.5"][@xmlns:xsi=*][@xsi:schemaLocation=*]/security/passwordSettings/expirationPolicy/resetPolicy/maxAttemptsPerAddress -v 5 test.xml

xmlstarlet по-прежнему не обновляет нужное значение: я думаю, что основная проблема здесь заключается в множественном значении конфигурации xmlns, но пока я не нашел решения этой проблемы.


person spaceman117X    schedule 05.10.2018    source источник


Ответы (1)


На самом деле вам нужно определить пространство имен с параметром -N и явно использовать его для каждого узла:

xmlstarlet ed -N a="http://artifactory.jfrog.org/xsd/2.0.5" -u /a:config/a:security/a:passwordSettings/a:resetPolicy/a:maxAttemptsPerAddress -v 5 file.xml

Здесь пространство имен a установлено на http://artifactory.jfrog.org/xsd/2.0.5 и используется для поиска всех узлов xpath, которые вы хотите обновить.

person oliv    schedule 05.10.2018
comment
Спасибо, я попробую это! - person spaceman117X; 05.10.2018
comment
Здорово! Мне просто нужно было добавить --inplace, иначе не изменится. Большое спасибо! - person spaceman117X; 05.10.2018