Creando nuevos elementos con xmlstarlet

Creando nuevos elementos con xmlstarlet

He estado intentando agregar nuevos elementos a un archivo XML.

Archivo original:

<levela>
  <levelb>
  </levelb>
</levela>

Estoy intentando obtener el siguiente resultado:

<levela>
  <levelb>
    <levelc>
      <element1>value1</element1>
      <element2>value2</element2>
      <element3>value3</element3>
    </levelc>
  </levelb>
</levela>

Mi intento actual es:

xmlstarlet ed -a /levela/lelvelb -t elem -n levelc -v "" \
    -i //levelc -t elem -n "element1" -v "value1" \
    file.xml

Pero mi archivo no está actualizado.

Respuesta1

Hay un error tipográfico en su xmlstarletinvocación ( lelvelb):

xmlstarlet ed -a /levela/lelvelb -t elem -n levelc -v "" \
    -i //levelc -t elem -n "element1" -v "value1" \
    file.xml

Para agregar un subnodo, necesita usar la -soperación not -aor -i:

xmlstarlet ed -s /levela/levelb -t elem -n levelc -v "" \
    -s //levelc -t elem -n "element1" -v "value1" \
    file.xml

Esto produce

<?xml version="1.0"?>
<levela>
  <levelb>
  <levelc><element1>value1</element1><element2>value2</element2></levelc></levelb>
</levela>

Puede agregar otras -soperaciones según sea necesario. También puedes dejar el vacío -vpara levelc.

Si desea modificarse file.xml, en lugar de obtener el resultado de la transformación en xmlstarletla salida estándar, agregue la -Lopción a ed:

xmlstarlet ed -L -s /levela/levelb -t elem -n levelc -v "" \
    -s //levelc -t elem -n "element1" -v "value1" \
    file.xml

información relacionada