IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Travail sur balises dans un fichier xml


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Août 2012
    Messages : 22
    Par défaut Travail sur balises dans un fichier xml
    Bonjour,

    J'ai un fichier xml dans lequel je cherche des ressources jdbc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    liste_ressource_jdbc=$(awk '/<factories xmi:type="resources.jdbc/,/<\factories>/' ${chemin_socle}/config/cells/CellBase/nodes/*/resources.xml)
    Cela retourne bien les ressources recherchées mais selon un format qu'il m'est difficile d'appréhender :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <factories xmi:type="resources.jdbc:DataSource" xmi:id="DataSource_1437400117880" name="SINF_ORACLE" jndiName="jdbc/SINF_ORACLE" description="Data source template" category="default" authMechanismPreference="BASIC_PASSWORD" authDataAlias="SINF_ORACLE" manageCachedHandles="false" logMissingTransactionContext="true" relationalResourceAdapter="builtin_rra" statementCacheSize="10" datasourceHelperClassname="com.ibm.websphere.rsadapter.Oracle11gDataStoreHelper"> <propertySet xmi:id="J2EEResourcePropertySet_1437401870101"> <resourceProperties xmi:id="J2EEResourceProperty_1437401870101" name="URL" type="java.lang.String" value="jdbc:oracle:thin:@devswi1.recm.id.fr.cly:12996:spinrct1" description="Datasource SINF_ORACLE" required="true"/> <resourceProperties xmi:id="J2EEResourceProperty_1437401870102" name="URL" type="java.lang.String" value="jdbc:oracle:thin:@devswi1_recm.id.fr.cly:12996:spinrct1" description="Datasource SINF_ORACLE" required="true"/> </propertySet> <connectionPool xmi:id="ConnectionPool_1437401870101" connectionTimeout="1800" maxConnections="30" minConnections="1" reapTime="180" unusedTimeout="1800" agedTimeout="20" purgePolicy="EntirePool" numberOfSharedPoolPartitions="0" numberOfUnsharedPoolPartitions="0" freePoolDistributionTableSize="0" surgeThreshold="-1" surgeCreationInterval="0" testConnection="false" testConnectionInterval="0" stuckTimerTime="0" stuckTime="0" stuckThreshold="0"/> <mapping xmi:id="MappingModule_1437401870101" mappingConfigAlias="DefaultPrincipalMapping" authDataAlias="SINF_ORACLE"/> </factories> <factories xmi:type="resources.jdbc:DataSource" xmi:id="DataSource_1441270150893" name="SINF_ORACLE_DEV" jndiName="jdbc/SINF_ORACLE_DEV" description="Data source template" category="default" authMechanismPreference="BASIC_PASSWORD" authDataAlias="SINF_ORACLE_DEV_ALIAS" manageCachedHandles="false" logMissingTransactionContext="true" relationalResourceAdapter="builtin_rra" statementCacheSize="10" datasourceHelperClassname="com.ibm.websphere.rsadapter.Oracle11gDataStoreHelper"> <propertySet xmi:id="J2EEResourcePropertySet_1441270150894"> <resourceProperties xmi:id="J2EEResourceProperty_1441270150894" name="URL" type="java.lang.String" value="jdbc:oracle:thin:@devswi1_dev.id.fr.cly:12996:spindvl1" description="Datasource SINF_ORACLE_DEV" required="true"/> </propertySet> <connectionPool xmi:id="ConnectionPool_1441270150894" connectionTimeout="1800" maxConnections="30" minConnections="1" reapTime="180" unusedTimeout="1800" agedTimeout="20" purgePolicy="EntirePool" numberOfSharedPoolPartitions="0" numberOfUnsharedPoolPartitions="0" freePoolDistributionTableSize="0" surgeThreshold="-1" surgeCreationInterval="0" testConnection="false" testConnectionInterval="0" stuckTimerTime="0" stuckTime="0" stuckThreshold="0"/> <mapping xmi:id="MappingModule_1441270150894" mappingConfigAlias="DefaultPrincipalMapping" authDataAlias="SINF_ORACLE_DEV_ALIAS"/> </factories> </resources.jdbc:JDBCProvider> </xmi:XMI>
    Je souhaite pouvoir travailler sur chacune des ressources trouvées (2 ici en l'occurence), mais de part ma commande awk je ne sépare déjà pas la première factorie de la 2ème.

    Je ne vous cache pas que je n'ai pas réussi à utiliser les regex de manière à sortir <factories xmi:type=\"resources.jdbc(.*)<\factories> correctement.

    Je souhaite mettre dans une variable chacune des ressources pour ensuite rechercher les champs qui m'intéressent, POUR CHAQUE RESSOURCE :
    name="SINF_ORACLE"
    jndiName="jdbc/SINF_ORACLE"
    value="jdbc:oracle:thin:@devswi1.recm.id.fr.cly:12996:spinrct1"
    authDataAlias="SINF_ORACLE"

    Donc j'ai 2 problèmes :

    1- Je reçois toutes les factories (ici il y en a 2 mais il peut y en avoir 15) et je n'arrive pas à les gérer une par une.

    2- Actuellement je cherche l'occurrence d'un champ, sa position et si elle est différente de 0 (donc si le nom cherché est trouvé), je la récupère ... ce n'est vraiment pas satisfaisant :-(

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    for ressource_jdbc in ${liste_ressource_jdbc}
    do
      #echo $ressource_jdbc
      pos_jndi=$(expr match "$ressource_jdbc" 'jndiName')
      if [ $pos_jndi != "0" ]; jndi=$ressource_jdbc; echo $jndi; fi
    done
    Pouvez-vous au moins m'aider à séparer les factories, à base d'une expression régulière, et s'il le faut, je passerais par un fichier intermédiaire dans lequel je copierais momentanément la factorie, pour aller en extirper les "clés cibles" (si vous avez un preg à me fournir sur chaque clé cherchée dans une factorie, je suis preneur ^^)

    Merci par avance pour votre aide et désolé pour le mode noob en expressions régulières, je vais faire le nécessaire pour les maîtriser de mieux en mieux désormais (livres, exos, sites memos ... )

    NB : En jython, cela est bien plus simple de récupérer ces informations, mais dans ce cas il me faut tout faire en shell script.

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    Bonjour,

    peut-on avoir une copie du fichier "source" ?

    que veux-tu faire de chaque jndiName ensuite ?

    NB : awk n'est pas plus du shell que [jp]ython.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Août 2012
    Messages : 22
    Par défaut
    Bonjour et d'abord merci pour la réponse.

    Voici le fichier : resources.xml

    Je veux récupérer le jndiName de chaque ressource (factorie jdbc), ainsi que value et authDataAlias :

    Ma boucle actuelle (pourrie) sur le résultat du awk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for ressource_jdbc in ${liste_ressource_jdbc}
    do
      pos_jndiName=$(expr match "$ressource_jdbc" 'jndiName')
      if [ $pos_jndiName != "0" ]; then jndiName=$(echo $ressource_jdbc); echo $jndiName; fi
      pos_value=$(expr match "$ressource_jdbc" 'value')
      if [ $pos_value != "0" ]; then value=$(echo $ressource_jdbc); echo $value; fi
      pos_authAlias=$(expr match "$ressource_jdbc" 'authDataAlias=".*"')
      if [ $pos_authAlias != "0" ]; then authAlias=$(echo $ressource_jdbc); echo $authAlias; fi
    done
    Et le résultat (sans traitement) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    jndiName="jdbc/SINF_ORACLE"
    authDataAlias="SINF_ORACLE"
    value="jdbc:oracle:thin:@devswi1.recm.id.fr.cly:12996:spinrct1"
    value="jdbc:oracle:thin:@devswi1_recm.id.fr.cly:12996:spinrct1"
    authDataAlias="SINF_ORACLE"/>
    jndiName="jdbc/SINF_ORACLE_DEV"
    authDataAlias="SINF_ORACLE_DEV_ALIAS"
    value="jdbc:oracle:thin:@devswi1_dev.id.fr.cly:12996:spindvl1"
    authDataAlias="SINF_ORACLE_DEV_ALIAS"/>
    NB : Ta remarque concernant awk est correcte, et saches que de me passer de awk ne me gène aucunement, tant que j'arrive à parser ce fichier xml et en extirper les informations citées ci-dessus :-)

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    expr est une commande externe superflue avec bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/bash
     
    shopt -s extglob #pour permettre l'expression à droite des [[
    while read line
    do
       declare -A aArr
       for i in $line
       do
          [[ $i == @(jndiName|value|authDataAlias)* ]] && {
             data="${i##*=}"
             aArr["${i%%=*}"]="${i//\"/}"
          }
       done
       printf '%s\n' "${aArr[@]}"
       echo "---"
       unset aArr
    done < <(\grep '<factories xmi:type="resources.jdbc:DataSource' resources.xml )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    jndiName=jdbc/SINF_ORACLE
    authDataAlias=SINF_ORACLE
    ---
    jndiName=jdbc/SINF_ORACLE_DEV
    authDataAlias=SINF_ORACLE_DEV_ALIAS
    ---
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre averti
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2012
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Août 2012
    Messages : 22
    Par défaut
    Bonjour,

    Alors merci pour le script que je vais adapter.

    3 choses :

    1) Mon awk me ramenait toute la section <factories ... <\factories> et non seulement la première ligne que me ramène le grep.
    D'ou la clé "value" qui n'est pas ramenée par le script, puisque pas dans la première ligne, contenant "factories xmi:type="resources.jdbc"
    Donc j'adapte en utilisant mon awk (spagrave ^^)

    2) J'étais sur ksh mais pour ne pas me prendre la tête (notamment sur le tableau), je vais faire tourner ce script avec bash.

    3) Les deux premières choses ne sont pas importantes, tu m'as apporté l'essentiel, et cela m'a bien dépanné.

    Sujet clos avec remerciements :-)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 18/05/2009, 08h25
  2. Récupérer plusieurs balises dans un fichier XML
    Par sandddy dans le forum Langage
    Réponses: 3
    Dernier message: 28/01/2009, 14h48
  3. tester la présence de balises dans le fichier xml
    Par Balbuzard dans le forum XSL/XSLT/XPATH
    Réponses: 7
    Dernier message: 29/08/2008, 15h11
  4. Pb de balises dans un fichier XML
    Par gaggy dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 20/10/2007, 14h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo