Me gustaría saber cómo puedo obtener el valor de un nodo con las siguientes rutas:
config/global/resources/default_setup/connection/host
config/global/resources/default_setup/connection/username
config/global/resources/default_setup/connection/password
config/global/resources/default_setup/connection/dbname
del siguiente XML:
<?xml version="1.0"?>
<config>
<global>
<install>
<date><![CDATA[Tue, 11 Dec 2012 12:31:25 +0000]]></date>
</install>
<crypt>
<key><![CDATA[70e75d7969b900b696785f2f81ecb430]]></key>
</crypt>
<disable_local_modules>false</disable_local_modules>
<resources>
<db>
<table_prefix><![CDATA[]]></table_prefix>
</db>
<default_setup>
<connection>
<host><![CDATA[localhost]]></host>
<username><![CDATA[root]]></username>
<password><![CDATA[pass123]]></password>
<dbname><![CDATA[testdb]]></dbname>
<initStatements><![CDATA[SET NAMES utf8]]></initStatements>
<model><![CDATA[mysql4]]></model>
<type><![CDATA[pdo_mysql]]></type>
<pdoType><![CDATA[]]></pdoType>
<active>1</active>
</connection>
</default_setup>
</resources>
<session_save><![CDATA[files]]></session_save>
</global>
<admin>
<routers>
<adminhtml>
<args>
<frontName><![CDATA[admin]]></frontName>
</args>
</adminhtml>
</routers>
</admin>
</config>
También quiero asignar ese valor a la variable para su uso posterior. Déjame saber tu idea.
command-line
text-processing
xml
xmllint
MagePsycho
fuente
fuente
Respuestas:
Usando
bash
yxmllint
(como lo indican las etiquetas):En caso de que solo haya una cadena XML y deba evitarse el uso de un archivo temporal, los descriptores de archivo son el camino a seguir
xmllint
(que se proporciona aquí/dev/fd/3
como argumento de archivo):fuente
Aunque ya hay muchas respuestas, voy a intervenir
xml2
.Con un poco de magia, incluso puedes configurarlas como variables directamente:
fuente
Lo siguiente funciona cuando se ejecuta contra sus datos de prueba:
Esto pone el contenido en variables
host
,username
,password
ydbname
.fuente
bash
no tiene soporte incorporado para el análisis XML. Necesita tener una herramienta que lo haga (xmlstarlet, xsltproc, un Python moderno, etc.), o no puede analizar XML correctamente.Una
bash
función pura , solo para el desafortunado caso en el que no se le permite instalar nada apropiado. Esto puede, y probablemente fallará, en XML más complicado:Uso:
Problemas conocidos:
fuente
Usando xmllint y la opción --xpath , es muy fácil. Simplemente puedes hacer esto:
Si necesita acceder al atributo de un elemento, también es fácil usar XPath. Imagina que tienes el archivo:
Las declaraciones de shell necesarias serían:
fuente
Puede utilizar la codificación de la interfaz de línea de comando php en los scripts de bash para manejar varios scripts complejos que en realidad abarcan varias líneas de codificación. Primero, intente hacer su solución usando scripts PHP, y luego pase los parámetros usando el modo CLI. Por lo tanto, puede obtener control sobre los excelentes usos de los analizadores XML.
El entorno parece que puede usar PHP en modo cliente a través del acceso ssh / shell.
Ahora, haga todas las cosas dentro de su archivo php. Haga uso de los parámetros de línea de comandos que puede tomar.
Incluso puede asignar esos valores de retorno al entorno Shell para continuar con el resto de sus scripts de shell.
Y la otra forma es usar la opción | grep para que coincida con el valor requerido dentro del archivo xml, si está bastante seguro de la estructura de su archivo xml que no cambia con el tiempo.
fuente
¡Este comentario usa solo comandos y métodos sh / bash! /test.xml es su archivo de tipo XML en la primera pregunta ...
salida:
si quieres escribir estos valores en el archivo usa este método:
este método sobrescribirá sus archivos locales utilizados solo para obtener valores (sus datos se perderán de los archivos de salida)
fuente