modificar ejemplo crear xml command-line xpath command xmlstarlet

modificar - crear xml java ejemplo



¿Cómo insertar un nuevo elemento debajo de otro con xmlstarlet? (4)

$ vim test.xml <?xml version="1.0" encoding="UTF-8" ?> <config> </config> $ xmlstarlet ed -i "/config" -t elem -n "sub" -v "" test.xml <?xml version="1.0" encoding="UTF-8"?> <sub></sub> <config> </config>

Pero quería que Sub fuera un hijo de la configuración. ¿Cómo debo cambiar el parámetro xpath de -i ?

BONIFICACIÓN: ¿Es posible insertar el elemento secundario directamente con un atributo e incluso tenerlo configurado en un valor? Algo como:

$ xmlstarlet ed -i "/config" -t elem -n "sub" -v "" -a attr -n "class" -v "com.foo" test.xml


Desde la versión 1.4.0 de XMLStarlet (con fecha 2012-08-26), puede usar $prev (o $xstar:prev ) como el argumento para -i , -a y -s para referirse al último conjunto de nodos insertado. Vea los ejemplos en el código fuente de XMLStarlet en los archivos doc/xmlstarlet.txt , examples/ed-backref1 , examples/ed-backref2 , y examples/ed-backref-delete . Ya no necesita usar el truco de insertar el elemento con un nombre de elemento temporal y luego cambiarle el nombre al final. Los examples/ed-backref2 ejemplo examples/ed-backref2 son particularmente útiles para mostrar cómo definir una variable a usar para referirse a una (la) nota creada anteriormente para que no tenga que hacer trucos como $prev/.. para "navegar" "fuera de un nodo.


Intenté el truco de cellux anterior. ¡Funcionó muy bien! ¡¡Gracias!! Pero, el formato no se mantuvo, solo para intentarlo, me deshice de las opciones -P y -S, ¡y los problemas de formato desaparecieron! Estoy usando CentOS. Puede ser que esto pueda ayudar a alguien.


Tuve un problema similar: tenía un archivo de configuración de Tomcat (server.xml) y tuve que insertar una etiqueta <Resource> con atributos predefinidos en la sección <GlobalNamingResources> .

Aquí está cómo se veía antes:

<GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <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>

Esto es lo que quería lograr:

<GlobalNamingResources> <!-- Editable user database that can also be used by UserDatabaseRealm to authenticate users --> <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" /> <Resource name="jdbc/templateassets" auth="Container" type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" url="jdbc:mysql://DBHOST:DBPORT/DBNAME?createDatabaseIfNotExist=false&amp;useUnicode=true&amp;characterEncoding=utf-8" username="DBUSER" password="DBPASS" maxActive="150" maxIdle="10" initialSize="10" validationQuery="SELECT 1" testOnBorrow="true" /> </GlobalNamingResources>

Aquí es cómo lo hice (fragmento de un script de shell):

if [ -n "$(xmlstarlet sel -T -t -v "/Server/GlobalNamingResources/Resource[@name=''jdbc/templateassets'']/@name" server.xml)" ]; then echo "Resource jdbc/templateassets already defined in server.xml" else echo "Adding resource jdbc/templateassets to <GlobalNamingResources> in server.xml" xmlstarlet ed -P -S -L -s /Server/GlobalNamingResources -t elem -n ResourceTMP -v "" / -i //ResourceTMP -t attr -n "name" -v "jdbc/templateassets" / -i //ResourceTMP -t attr -n "auth" -v "Container" / -i //ResourceTMP -t attr -n "type" -v "javax.sql.DataSource" / -i //ResourceTMP -t attr -n "driverClassName" -v "com.mysql.jdbc.Driver" / -i //ResourceTMP -t attr -n "url" -v "jdbc:mysql://DBHOST:DBPORT/DBNAME?createDatabaseIfNotExist=false&useUnicode=true&characterEncoding=utf-8" / -i //ResourceTMP -t attr -n "username" -v "DBUSER" / -i //ResourceTMP -t attr -n "password" -v "DBPASS" / -i //ResourceTMP -t attr -n "maxActive" -v "150" / -i //ResourceTMP -t attr -n "maxIdle" -v "10" / -i //ResourceTMP -t attr -n "initialSize" -v "10" / -i //ResourceTMP -t attr -n "validationQuery" -v "SELECT 1" / -i //ResourceTMP -t attr -n "testOnBorrow" -v "true" / -r //ResourceTMP -v Resource / server.xml fi

El truco es dar temporalmente un nombre único al nuevo elemento, para que se pueda encontrar más adelante con una expresión XPATH. Después de que se hayan agregado todos los atributos, el nombre se cambia de nuevo a Recurso (con -r).

El significado de las otras opciones xmlstarlet:

-P (or --pf) - preserve original formatting -S (or --ps) - preserve non-significant spaces -L (or --inplace) - edit file inplace


Utilice -s (o --subnode ) en lugar de -i . Con respecto a la bonificación, no puede insertar un elemento con un atributo directamente, pero dado que cada operación de edición se realiza en secuencia, para insertar un elemento y luego agregar un atributo:

> xml ed -s /config -t elem -n sub -v "" -i /config/sub -t attr -n class -v com.foo test.xml <?xml version="1.0" encoding="UTF-8"?> <config> <sub class="com.foo"></sub></config>