rss
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

Lecture sur un fichier xsd

evita8, le samedi 29 mars 2008 à 14:56:46
Bonjour,

Traitement souhaité sur mon fichier xsd :

Connaissant le nom du répertoire racine (Arbre), je voudrais réccuperer le nom du sous élément (Branche) dans une variable.
J'ai commencé mon script mais je ne sais pas quelle fonction utiliser pour reccuperer le nom du sous élément (je ne peux pas utiliser grep puisqu'il y a d'autres lignes du meme type...)

Merci !

Mon script :

# Je reccupere la ligne de debut de la declaration des sous element
ligne=$(grep -m 1 " *<xsd:complexType name=\"Arbre\">" fichier.xsd)
echo $ligne
if [ $? = 1 ]; then
echo "Declaration des sous elements intouvable"
exit
else

# Je reccupere le numero de la ligne de debut de la declaration des sous element
numero=$(grep -n "$ligne" fichier.xsd | cut -d: -f1)
echo $numero
fi

# La je voudrais effectuer une lecture a partir du numero de ligne reccuperé
# pour reccuperer la ligne ou est declaree le sous element Branche


Le fichier xsd:
<?xml version="1.0" encoding="UTF-8" ?>
<xsd:schema xmlns="" xmlns:xsd=" http://www.w3.org/2001/XMLSchema">

<xsd:element name="Arbre" type="Arbre"/>

<xsd:complexType name="Arbre">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="Branche" type="Branche"/>
</xsd:sequence>
</xsd:complexType>

<xsd:complexType name="Branche">
<xsd:sequence>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="Feuille1" type="Feuille1"/>
<xsd:element maxOccurs="unbounded" minOccurs="0" name="Feuille2" type="Feuille2"/>
</xsd:sequence>
<xsd:attribute name="contenance" type="xsd:int" use="required"/>
</xsd:complexType>

<xsd:complexType name="Feuille1">
<xsd:attribute name="nom" type="xsd:string" use="required"/>
<xsd:attribute name="numero" type="xsd:int" use="required"/>
</xsd:complexType>

<xsd:complexType name="Feuille2"/>

</xsd:schema>
Répondre à evita8  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le samedi 29 mars 2008 à 15:26:13
Salut,

Avant de te donner une solution, 2 ou 3 petites choses...
Déjà pour récupérer le numéro de ligne, un simple :
grep -n " *<xsd:complexType name=\"Arbre\">" fichier.xsd
suffit amplement.

Ensuite, ta vérification du code retour ne sert à rien dans la mesure ou tu fais un "echo" avant et par conséquent, que la variable soit pleine ou vide, le "echo" se fera quand même et c'est le code retour de la commande "echo" qui sera testé et retournera toujours "vrai" !

Ceci dit, voilà une solution à ton problème :
sed -n '/<xsd:complexType name="Arbre">/{n;n;s/.*="\([^ "]*\).*/\1/p}' fichier.xsd
Branche
;-))
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
Répondre à jipicy

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
evita8, le samedi 29 mars 2008 à 16:33:22
Merci pour ta réponse !

En fait je me suis mal exprimé... désolé..

Je ne suis pas censé connaître le nom du sous élément (Branche) ; c'est pour cela que je voulais récupérer toute la ligne pour ensuite pouvoir prendre le nom
Répondre à evita8

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le samedi 29 mars 2008 à 16:56:18
sed -n '/<xsd:complexType/{n;n;s/.*="\([^ "]*\).*/\1/p;q}' 
;-))
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
Répondre à jipicy

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
evita8, le samedi 29 mars 2008 à 17:41:45
Merci pour ta réponse.
Excuse ma bêtise mais je ne comprends vraiment pas ce que fait cette ligne !!

Ce que je crois avoir compris :

'/<xsd:complexType/{n;n;s/.*="\([^ "]*\).*/\1/p;q}' ->la requête

/<xsd:complexType/ -> 1° expression regulière

{n;n;s -> je ne vois pas...

/.*="\([^ "]*\).*/ -> 2° expression régulière

\([^ "]*\) -> portion d'expression régulière

{n;n;s/.*="\([^ "]*\).*/\1/p;q}\1/p;q} -> la commande
p envoie le résultat sur la sortie standard et que fais q ?


Et j'ai une erreur lors du lancement du script :

+ sed -n '/<xsd:complexType/{n;n;s/.*="\([^ "]*\).*/\1/p;q}' fichier.xsd
sed: 1: "/<xsd:complexType/{n;n; ...": extra characters at the end of q command


I need help !!
Répondre à evita8

5


  • 1
    Ce message vous semble utile, votez !
  • Ce message ne vous semble pas utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le samedi 29 mars 2008 à 18:08:41
Pour ce qui concerne SED, je te renvoie vers la FAQ : SED - The Stream EDitor - Part I

Avant d'insérer la commande dans un script, vérifie quelle marche bien déjà en ligne de commande...
sed -n '
"-n" demande d'affichage que sur demande avec la commande "p" 

/<xsd:complexType/
le motif à rechercher

{
Regroupement de commande à appliquer si le motif est trouvé

n
Demande l'ajout de la ligne suivante dans l'espace de travail en remplacement de la ligne courante

;
Séparateur de commande

n;
idem que précédemment

s/.../.../
Commande de substitution


.*="\([^ "]*\).*
Expression régulière à diviser en 3 parties

.*="
Grace à la gourmandise des expressions régulières, on récupère tout ce qui se trouve avant le dernier mot sur la ligne précédé d'un signe égale et suivi d'un guillemet

\([^ "]*\)
Sous-expression. Cette partie est encadrée par des parenthèses (elles même protégées par des anti-slashs) pour pouvoir être réutilisée dasn la partie de remplacement. Elle matche donc tout ce qui suivait le signe égale et le guillemet précédent, jusqu'au prochain guillemet qui délimitera sa portée et ne devra pas être pris

.*
Le reste de la ligne

\1
Le \1 (référence arrière) fait donc référence à la sous-expression matchée précédemment

p
La commande d'affichage. On affiche alors la référence à "\1"


;q
Et on demande de quitter immédiatement le script sans chercher d'autres lignes (commande "q" (quit))

}'
Fin du groupement de commandes 
;-)) JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
Répondre à jipicy

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
evita8, le samedi 29 mars 2008 à 18:57:40
Merci pour cette réponse !! Tout commence à s'éclaircir !

J'avais un message d'erreur tout à l'heure à cause du ";" manquant après la commande q
Répondre à evita8

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
evita8, le dimanche 30 mars 2008 à 00:41:03
Hello !

J'ai maintenant un autre soucis :
Je souhaite parcourir mon fichier entre la balise <xsd:complexType name="Branche"> et sa balise fermante, dans le but de réccupérer la ligne
<xsd:attribute name="contenance" type="xsd:int" use="required"/>

Ma ligne de commande :

sed -n '/<xsd:complexType name="Branche">/,/<\/xsd:complexType>/"<xsd:attribute/p"' fichier.xsd

Ou peut être le problème ?
Répondre à evita8

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le dimanche 30 mars 2008 à 09:14:27
sed -n '/<xsd:complexType name="Branche">/,/<\/xsd:complexType>/{/<xsd:attribute/p}'
;-))
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
Répondre à jipicy

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
evita8, le dimanche 30 mars 2008 à 15:40:37
Bonjour !
Merci pour cette ligne de commande !

Un petit hic : elle ne fonctionne chez moi que si je mets un ";" après la commande "p"
Est ce normal ? Il me semble que la dernière commande avant le "}" n'est pas suivie du ";"
[adresse[,adresse]]{commande1; commande2; commande3}

Autre chose,
J'ai mis le premier motifs dans une variable :
debut="<xsd:complexType name="Branche">"

Quelle est la bonne syntaxe ?

sed -n '"$debut",/<\/xsd:complexType>/{/<xsd:attribute/p;}' fichier.xsd

Merci !
Répondre à evita8

10


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le dimanche 30 mars 2008 à 15:45:07
Un petit hic : elle ne fonctionne chez moi que si je mets un ";" après la commande "p"
Est ce normal ?

Ça dépend peut être de ta version de "sed"... :-\

Pour les variables, voir :
SED - The Stream EDitor - Part II - Le remplacement de variables

;-)) JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
Répondre à jipicy

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
evita8, le dimanche 30 mars 2008 à 20:36:54
Oui c'était dans le tutoriel, merci !

C'était

sed -n '/'"$debut"'/,/<\/xsd:complexType>/{/<xsd:attribute/p;}' fichier.xsd
Répondre à evita8

12


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le dimanche 30 mars 2008 à 20:41:37
De rien ;-))
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
Répondre à jipicy

13


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
evita8, le dimanche 30 mars 2008 à 22:17:36
J'ai encore un problème !

Je voudrai lire les lignes qui se trouvent entre les balises <xsd:complexType name="Feuille1"> et sa balise fermante.
et reccuperer le nom des attributs, leurs type et leurs "use"

Le problème est que je ne connais pas le nombre d'attributs qu'il peut y avoir, il peut y en avoir n...
La commande sed serait donc inefficace pour ce genre de traitement (vu qu'on ne sait pas le nombre de "n;" qu'il faudra faire)

Ayant traité la ligne (<xsd:complexType name="Feuille1">) auparavent, je connais son numéro de ligne.

<xsd:complexType name="Feuille1"> 
	<xsd:attribute name="nom" type="xsd:string" use="required"/> 
	<xsd:attribute name="numero" type="xsd:int"	 use="required"/> 
</xsd:complexType>



Comment pourrai je faire ?
Répondre à evita8

14


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le dimanche 30 mars 2008 à 23:46:50
sed -n '/<xsd:complexType name="Feuille1">/,/<\/xsd:complexType>/{//d;s/[^ ]* //;s/ /\n/g;s/\/>$//;p}'
ou
sed -n '
/<xsd:complexType name="Feuille1">/,/<\/xsd:complexType>/{
//d
s/[^ ]*//
s/ [^=]*=//g
s/""/\n/g
s/\/>$//
s/^"\|"$//g
p
}' fichier

Le 1er renvoie :
name="nom"
type="xsd:string"
use="required"
name="numero"
type="xsd:int"
use="required"


Le second :
nom
xsd:string
required
numero
xsd:int
required
;-))
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.
Répondre à jipicy

15


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 evita8, le lundi 31 mars 2008 à 00:10:37
Mille merci ! ça marche !
Répondre à evita8
Logiciels pertinents trouvés dans les téléchargements
Télécharger IsoBuster 2.4IsoBuster - IsoBuster est un outil de récupération de CD, DVD, HD-DVD et BD prenant en charge tous les formats et tous leurs système de...Catégorie: Gravure
Licence: Freeware/gratuit
Télécharger ModPlug Player 1.46.01ModPlug Player - MODPlug est un lecteur permettant de lire des fichiers MOD, c'est-à-dire des pistes de séquenceurs (trackers), mélant des...Catégorie: Lecteurs audio
Licence: Freeware/gratuit
Télécharger Switch Sound Format Converter 1.05Switch Sound Format Converter - Switchest un convertisseur de formats audio pour Windows ou Mac, capable de convertir des fichiers audio à partir de...Catégorie: Conversion audio
Licence: Freeware/gratuit
Télécharger DS Monkey Audio - Filtre APE 1.00DS Monkey Audio - Filtre APE - Le format MonkeysAudio (extension *.ape) est un format de compression audio lossless (sans pertes) permettant de réduire la...Catégorie: Plugins audio
Licence: Freeware/gratuit
Plus de logiciels gratuits sur « Lecture sur un fichier xsd »