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

Modules Perl Discussion :

[XML]LibXML et comparatif de fichiers


Sujet :

Modules Perl

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Points : 3
    Points
    3
    Par défaut [XML]LibXML et comparatif de fichiers
    Bon le titre du sujet est peut être pas très clair mais je vais essayer de m'expliquer au mieux.
    J'ai besoin de comparer plusieurs fichiers XML, pour repérer les parties redondantes de code, en se basant sur un fichier de référence.

    Mes fichiers ressemblent à ça en gros (j'ai pris qu'une petite partie parce qu'ils sont assez volumineux)
    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
    18
    19
    <?xml version="1.0" encoding="ISO-8859-1"?>
    <preferences>
      <category name="General">
        <category_description>Teamcenter Preferences</category_description>
        <preference name="AE_dataset_default_keep_limit" type="Integer" array="false" disabled="false">
          <preference_description>Default number of versions of Teamcenter datasets to keep before deleting old versions.</preference_description>
          <context name="Teamcenter">
            <value>2</value>
          </context>
        </preference>
        <preference name="ALS_LANG_PROP_DISP_RULES" type="String" array="true" disabled="false">
          <preference_description>ALS_LANG_PROP_DISP_RULES</preference_description>
          <context name="Teamcenter">
            <value>type=_ASSEMBLAGE,display=%I-%N,%N=RevMaster._DESCRIPTION_%L</value>
            <value>type=_ASSEMBLAGE Revision,display=%I-%N/%R,%N=RevMaster._DESCRIPTION_%L</value>
            <value>type=_PART,display=%I-%N,%N=RevMaster._DESCRIPTION_%L</value>
            <value>type=_PART Revision,display=%I-%N/%R,%N=RevMaster._DESCRIPTION_%L</value>
          </context>
        </preference>
    Mon code ressemble actuellement à ceci
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    #!C:\\strawberry\\perl\\bin\\perl -w
     
    use strict;
    use Fcntl;
    use XML::LibXML;
    use Data::Dumper;
    use diagnostics -verbose;
     
    sub ParseXMLFile {
    	# Initialisation parsers xml
    	my $xml = XML::LibXML->new();
    	my $tree = $xml->parse_file($_[0]);
     
    	# Ouvrir ou créer fichiers de rapport
    	my @fpath = split(m/\./, $_[0]);
    	my $path = "$fpath[0]_Rapport.txt";
    	open(RAPPORT, ">$path") || die $!;
    	sysopen(RAPPORT, $path, O_WRONLY|O_TRUNC|O_CREAT) || die $!;
    	sysopen(RAPPORT, $path, O_WRONLY|O_TRUNC|O_CREAT, 0666) || die $!;
    	# Début parsing
    	my $root = $tree->getDocumentElement;
     
    	my @preferences = $root->getElementsByTagName('preference');
    	foreach my $preference (@preferences) {
    		#Nom préférence
    		print RAPPORT "########\n";
    		print RAPPORT "Preference:\n",
    		"-Name: ", $preference->getAttribute("name"), "\n",
    		"-Type: ", $preference->getAttribute("type"), "\n",
    		"-Array: ", $preference->getAttribute("array"), "\n",
    		"-Disabled: ", $preference->getAttribute("disabled"), "\n";
    		# Context
    		my @context = $preference->getElementsByTagName("context");
    		print RAPPORT "\nContext:\n",
    		"-Name: " ,$context[0]->getAttribute("name"),"\n",
    		"\n-Values","\n";
    		#"\t-", $context[0]->getElementsByTagName("value")->[0]->getFirstChild->getData , "\n";		
     
     
    		# Description
    		#print RAPPORT $preference->getElementsByTagName('preference_description')->[0]->getData, "\n";
    		print RAPPORT "\n########\n\n\n";
    	};
    	print "Rapport effectue \n";
    	close RAPPORT;	
    };
     
    my $rep = "D:\\Arthur\\xmls\\";
    my @files = glob($rep."*.xml");
    foreach (@files) {
    	print "\n";
    	my $path = join("", $rep, $_);
    	if (-f $_)
    	{
    		print $_." existe\n";
    		if (-r $_) {
    			print $_." lisible\n";
    			ParseXMLFile($_);
    		}
    	}
    	else 
    	{
    		print "Fichier ".$_." non existant\n";
    	}		
    };
    Mes problèmes actuels sont que je n'arrive pas à extraire le contenu des balises <preference_description> et <value> qui peut contenir une valeur simple ou bien plusieurs valeurs définies par type=...
    J'ai essayé différentes choses notamment avec getElementsTagByName et getData en essayant de comprendre ce tutoriel

    J'ai commencé à apprendre le Perl il y a très peu longtemps, et je ne m'y connais pas trop dans ce genre de langage (le seul que je connais bien est le Lua)

    Merci d'avance de m'aider à résoudre ce problème

  2. #2
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Bon j'ai réussi à résoudre mon problème en utilisant XML::Twig

    Voici mon code si ça peut en aider certains:

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #!C:\\strawberry\\perl\\bin\\perl -w
     
    use strict;
    use Fcntl;
    use XML::Twig;
    use Data::Dumper;
    use diagnostics -verbose;
     
    sub ParseXMLFile {
    	# Initialisation parsers xml
    	my $twig = new XML::Twig( Twig_handlers => { 'preference' => \&preference, }, );
     
    	# Ouvrir ou créer fichiers de rapport
    	my @fpath = split(m/\./, $_[0]);
    	my $path = "$fpath[0]_Rapport.txt";
    	open(RAPPORT, ">$path") || die $!;
    	sysopen(RAPPORT, $path, O_WRONLY|O_TRUNC|O_CREAT) || die $!;
    	sysopen(RAPPORT, $path, O_WRONLY|O_TRUNC|O_CREAT, 0666) || die $!;
     
    	$twig->parsefile($_[0]);
     
    	close RAPPORT;
    	print "Rapport effectue\n";
    }
     
    sub preference {
    	my ( $twig, $TwigPref ) = @_;
    	print RAPPORT "#########\nPreference:\n",
    	"-Name: ", $TwigPref->att('name'), "\n",
    	"-Type: ", $TwigPref->att('type'), "\n",
    	"-Array: ", $TwigPref->att('array'), "\n",
    	"-Disabled: ", $TwigPref->att('disabled'), "\n",
    	"-Description: ", $TwigPref->field('preference_description'), "\n";
     
    	my ($TwigContext) = $TwigPref->children('context');
    	print RAPPORT "\n-Context\n",
    	'    -Name: ', $TwigContext->att('name'), "\n",
    	"    -Value: \n";
    	foreach my $TwigContextValue ($TwigContext->children('value')) {
    		print RAPPORT "      ",$TwigContextValue->text, "\n";		
    	};
     
     
     
    	print RAPPORT "########\n\n";
    	$twig->purge;
      	return;
    };
     
    my $rep = "D:\\Arthur\\xmls\\";
    my @files = glob($rep."*.xml");
    foreach (@files) {
    	print "\n";
    	my $path = join("", $rep, $_);
    	if (-f $_)
    	{
    		print $_." existe\n";
    		if (-r $_) {
    			print $_." lisible\n";
    			ParseXMLFile($_);
    		}
    	}
    	else 
    	{
    		print "Fichier ".$_." non existant\n";
    	}		
    };

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

Discussions similaires

  1. [SOAP][XML][C#.NET] Téléchargement de fichiers XML
    Par juniorAl dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 27/06/2005, 09h35
  2. [XML]Comment tester que mon fichier XML est comme ceci?
    Par Devil666 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 02/06/2005, 13h41
  3. Réponses: 14
    Dernier message: 25/10/2004, 21h33
  4. Réponses: 4
    Dernier message: 23/10/2003, 08h03
  5. XML Schema et inclusions de fichiers XML
    Par monk31 dans le forum XML/XSL et SOAP
    Réponses: 8
    Dernier message: 08/10/2003, 14h17

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