Как добавить тег с XmlStarlet в документ XML без дублирования - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь добавить тег 'Listener' в мой документ server.xml tomcat. Но оно умножается, когда я пытаюсь его добавить.

Когда я попробовал следующее, он размещает несколько тегов, и добавленный атрибут добавляется к каждому тегу слушателя.

xmlstarlet edit --omit-decl \
--insert "/Server" --type elem --name "Listener" \
--subnode "/Server/Listener" --type attr -name "className" --value "org.jboss.modcluster.container.tomcat.ModClusterListener" \
server.xml > temp.xml

Документ

<Server port="8005" shutdown="SHUTDOWN">
  <Listener className="org.apache.catalina.startup.VersionLoggerListener" />
  <Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener" />
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener" />

  <GlobalNamingResources>
    <Resource name="UserDatabase" auth="Container"
              type="org.apache.catalina.UserDatabase"
              description="User database that can be updated and saved"
              factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
              pathname="conf/tomcat-users.xml" />
  </GlobalNamingResources>
  <Service name="Catalina">
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
    <Engine name="Catalina" defaultHost="localhost">
      <Realm className="org.apache.catalina.realm.LockOutRealm">
        <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
               resourceName="UserDatabase"/>
      </Realm>

      <Host name="localhost"  appBase="webapps"
            unpackWARs="true" autoDeploy="false" deployOnStartup="true">
        <Valve className="org.apache.catalina.valves.RemoteIpValve" remoteIpHeader="X-Forwarded-For" protocolHeader="X-Forwarded-Proto"/>
        <Valve className="org.apache.catalina.valves.ErrorReportValve" showReport="false"
               showServerInfo="false" />
      </Host>
    </Engine>
  </Service>
</Server>

Что мне нужно, так это добавить один тег 'Listener', и этот тег должен иметь имя класса modcluster.

1 Ответ

0 голосов
/ 06 июня 2019

Это действительно сработало для меня:

xmlstarlet edit --omit-decl \
--append "Server/Listener[5]" --type elem --name "Listener" \
--subnode "/Server/Listener[6]" --type attr -name "className" --value "org.jboss.modcluster.container.tomcat.ModClusterListener" \
server.xml > temp.xml
...