Recent Changes - Search:

Accueil

OpenSSL

SyncML

Apache Portable Runtime

Libxml2

Net-snmp

CUrl

Boost

Perl

ZLib

Samba

VPN

Serveurs de messagerie

edit

PERL/XMLParser

PERL.XMLParser History

Hide minor edits - Show changes to output

June 04, 2007, at 11:52 AM by Arnaud Grandville -
Changed lines 1-4 from:
Ce code ci-dessous permet la fusion de données XML.\\
to:
(:keywords perl, xml, parser, fusion, XMLParser:)
%right% [[http://www
.google.com/translate?u=http%3A%2F%2Fwww.grandville.net%2Fpmwiki.php%3Fn%3D{$FullName}&langpair=fr%7Cen&hl=fr&ie=UTF8|http://www.grandville.net/pub/img/GB.gif]]  [[http://www.google.com/translate?u=http%3A%2F%2Fwww.grandville.net%2Fpmwiki.php%3Fn%3D{$FullName}&langpair=fr%7Cde&hl=fr&ie=UTF8|http://www.grandville.net/pub/img/D.gif]]

Changed line 6 from:
L'objectif de ce code est le parcours d'un arbre principal pour y détecter un noeud particulier et le mettre à jour ou y insérer de nouvelles données XML.\\
to:
L'objectif de ce code est le parcours d'un arbre principal pour y détecter un noeud particulier et le mettre à jour avec de nouvelles données XML.\\
Changed lines 8-10 from:
L'arborescence d'origine ($xp) est lue jusqu'à ce que la pseudo ligne ''<Domain Name="DOIN7L9R"><Application Name="CAC07015108">'' soit détectée.\\
Le noeud détecté est fusionné avec le nouveau noeud ($insert) de la façon suivante :
* si les étiquettes (ici ''<Domain>'') sont identiques, tous les nouveaux attributs sont ajoutés ou mis à jour sur la base des nouvelles valeurs.
to:
Dans cette exemple l'arborescence d'origine ($xp) est lue jusqu'à ce que la pseudo ligne ''<Domain Name="DOIN7L9R"><Application Name="CAC07015108">'' soit détectée.\\
Le noeud détecté est alors fusionné avec le nouveau noeud ($insert) de la façon suivante :
* si les étiquettes (ici ''<Domain>'') sont identiques, les attributs sont ajoutés ou mis à jour sur la base des nouvelles valeurs.
May 24, 2007, at 10:35 AM by Arnaud Grandville -
May 24, 2007, at 10:34 AM by Arnaud Grandville -
Changed line 7 from:
* si les étiquettes (ici ''<Domain>'') sont identiques, tous les nouveaux attributs sont ajoutés ou mis à jour avec les nouvelles valeurs.
to:
* si les étiquettes (ici ''<Domain>'') sont identiques, tous les nouveaux attributs sont ajoutés ou mis à jour sur la base des nouvelles valeurs.
May 24, 2007, at 10:33 AM by Arnaud Grandville -
Changed line 3 from:
L'objectif de ce code est le parcour d'un arbre principal pour y détecter un noeud particulier et le mettre à jour ou y insérer de nouvelles données XML.\\
to:
L'objectif de ce code est le parcours d'un arbre principal pour y détecter un noeud particulier et le mettre à jour ou y insérer de nouvelles données XML.\\
May 24, 2007, at 10:26 AM by Arnaud Grandville -
Changed line 136 from:
   <Application Name="CAC07015108">%red%
to:
   <Application Name="CAC07015108">
May 24, 2007, at 10:24 AM by Arnaud Grandville -
Changed line 5 from:
L'arborescence d'origine ($xp) est lue jusqu'à ce que la speudo ligne ''<Domain Name="DOIN7L9R"><Application Name="CAC07015108">'' soit détectée.\\
to:
L'arborescence d'origine ($xp) est lue jusqu'à ce que la pseudo ligne ''<Domain Name="DOIN7L9R"><Application Name="CAC07015108">'' soit détectée.\\
May 24, 2007, at 10:24 AM by Arnaud Grandville -
Changed line 5 from:
L'arborescence d'origine ($xp) est lue jusqu'à ce que la ligne contenant ''<Domain Name="DOIN7L9R"><Application Name="CAC07015108">'' soit détectée.\\
to:
L'arborescence d'origine ($xp) est lue jusqu'à ce que la speudo ligne ''<Domain Name="DOIN7L9R"><Application Name="CAC07015108">'' soit détectée.\\
May 24, 2007, at 10:23 AM by Arnaud Grandville -
Changed line 3 from:
L'objectif de ce code est le parcour d'un arbre principal y détecter un noeud particulier et le mettre à jour ou y insérer un nouvel arbre XML.\\
to:
L'objectif de ce code est le parcour d'un arbre principal pour y détecter un noeud particulier et le mettre à jour ou y insérer de nouvelles données XML.\\
Changed lines 5-9 from:
L'arborescence d'origine ($xp) est lue jusqu'à ce que la ligne contenant ''<Domain Name=\"DOIN7L9R\"><Application Name=\"CAC07015108\">'' soit détectée.\\
Le noeud détecté est fusionné avec le nouveau noeud ($insert) de la façon suivante :\\
-
si les étiquettes (ici ''<Domain>'') sont identiques, tous les nouveaux attributs sont ajoutés ou mis à jour avec les nouvelles valeurs.\\
-
si l'étiquette est différente, la nouvelle étiquette est ajoutée après (''insertAfter'') l'étiquette courante.\\
-
si l'étiquette ajoutée contient des fils (getChildNodes != null), ses fils sont ajoutés (''appendChild'') au noeud courant.\\
to:
L'arborescence d'origine ($xp) est lue jusqu'à ce que la ligne contenant ''<Domain Name="DOIN7L9R"><Application Name="CAC07015108">'' soit détectée.\\
Le noeud détecté est fusionné avec le nouveau noeud ($insert) de la façon suivante :
* si les étiquettes (ici ''<Domain>'') sont identiques, tous les nouveaux attributs sont ajoutés ou mis à jour avec les nouvelles valeurs.
* si l'étiquette est différente, la nouvelle étiquette est ajoutée après (''insertAfter'') l'étiquette courante.
* si l'étiquette ajoutée contient des fils (getChildNodes != null), ses fils sont ajoutés (''appendChild'') au noeud courant.
\\
May 24, 2007, at 10:21 AM by Arnaud Grandville -
Changed line 1 from:
Ce code ci-dessous permet la fusion de données au format XML.\\
to:
Ce code ci-dessous permet la fusion de données XML.\\
May 24, 2007, at 10:21 AM by Arnaud Grandville -
Changed lines 135-136 from:
   >>red<<
<Application Name="CAC07015108">%red%
to:
   <Application Name="CAC07015108">%red%
May 24, 2007, at 10:20 AM by Arnaud Grandville -
Changed lines 5-7 from:
L'arborescence d'origine ($xp) est lue jusqu'à ce que la ligne contenant ''<Domain Name=\"DOIN7L9R\"><Application Name=\"CAC07015108\">'' soit détecté.\\
Ce noeud est fusionné avec le nouveau noeud ($insert) de la façon suivante :\\
- si les étiquettes (ici ''<Domain>'') sont identiques, tous les nouveaux attributs sont ajoutés ou les anciens mis à jour avec la nouvelle valeur.\\
to:
L'arborescence d'origine ($xp) est lue jusqu'à ce que la ligne contenant ''<Domain Name=\"DOIN7L9R\"><Application Name=\"CAC07015108\">'' soit détectée.\\
Le noeud détecté est fusionné avec le nouveau noeud ($insert) de la façon suivante :\\
- si les étiquettes (ici ''<Domain>'') sont identiques, tous les nouveaux attributs sont ajoutés ou mis à jour avec les nouvelles valeurs.\\
May 24, 2007, at 10:19 AM by Arnaud Grandville -
Changed line 5 from:
L'arborescence d'origine ($xp) est lu jusqu'à ce que la ligne contenant ''<Domain Name=\"DOIN7L9R\"><Application Name=\"CAC07015108\">'' soit détecté.\\
to:
L'arborescence d'origine ($xp) est lue jusqu'à ce que la ligne contenant ''<Domain Name=\"DOIN7L9R\"><Application Name=\"CAC07015108\">'' soit détecté.\\
May 24, 2007, at 10:19 AM by Arnaud Grandville -
Changed line 115 from:
# Fonction permettant d'afficher le node courant est tous ses pères
to:
# Fonction permettant d'afficher le node courant précédé tous ses pères
May 24, 2007, at 10:17 AM by Arnaud Grandville -
Changed line 151 from:
<Application Name="toto" Name3="ff" Name2="ff">
to:
<Application Name="CAC07015108" Name3="ff" Name2="ff">
May 24, 2007, at 10:17 AM by Arnaud Grandville -
Changed lines 1-2 from:
Ce code ci-dessous permet la fusion de fichiers XML.\\
L'objectif étant de parcourir un arbre principal pour détecter un noeud particulier pour la mettre à jour ou insérer une nouvelle branche
XML.\\
to:
Ce code ci-dessous permet la fusion de données au format XML.\\
Changed lines 3-5 from:
L'arborescence d'origine ($xp) est lue jusqu'à ce que la ligne contenant ''<Domain Name=\"DOIN7L9R\"><Application Name=\"CAC07015108\">'' soit détecté.\\
Ce noeud est fusionné avec le nouveau noeud de la façon suivante :
\\
- si les étiquettes (''<Domain>'') sont identiques, tous les nouveaux attributs sont ajoutés ou les anciens mis à jour avec la nouvelle valeur.\\
to:
L'objectif de ce code est le parcour d'un arbre principal y détecter un noeud particulier et le mettre à jour ou y insérer un nouvel arbre XML.\\
\\
L'arborescence d'origine
($xp) est lu jusqu'à ce que la ligne contenant ''<Domain Name=\"DOIN7L9R\"><Application Name=\"CAC07015108\">'' soit détecté.\\
Ce noeud est fusionné avec le nouveau noeud ($insert) de la façon suivante :\\
- si les étiquettes (ici
''<Domain>'') sont identiques, tous les nouveaux attributs sont ajoutés ou les anciens mis à jour avec la nouvelle valeur.\\
Changed line 9 from:
- si l'étiquette ajouté contient des fils (getChildNodes != null), ils sont ajoutés (''appendChild'').\\
to:
- si l'étiquette ajoutée contient des fils (getChildNodes != null), ses fils sont ajoutés (''appendChild'') au noeud courant.\\
May 24, 2007, at 10:13 AM by Arnaud Grandville -
Added lines 1-182:
Ce code ci-dessous permet la fusion de fichiers XML.\\
L'objectif étant de parcourir un arbre principal pour détecter un noeud particulier pour la mettre à jour ou insérer une nouvelle branche XML.\\
\\
L'arborescence d'origine ($xp) est lue jusqu'à ce que la ligne contenant ''<Domain Name=\"DOIN7L9R\"><Application Name=\"CAC07015108\">'' soit détecté.\\
Ce noeud est fusionné avec le nouveau noeud de la façon suivante :\\
- si les étiquettes (''<Domain>'') sont identiques, tous les nouveaux attributs sont ajoutés ou les anciens mis à jour avec la nouvelle valeur.\\
- si l'étiquette est différente, la nouvelle étiquette est ajoutée après (''insertAfter'') l'étiquette courante.\\
- si l'étiquette ajouté contient des fils (getChildNodes != null), ils sont ajoutés (''appendChild'').\\
 

(:source lang=perl :)
#!/usr/bin/perl -w
#

use XML::XPath::XMLParser;
use XML::XPath::Node ':node_keys';

$xp = XML::XPath::XMLParser->new(xml=> "<Domain Name=\"DOIN7L9R\"><Application Name=\"CAC07015108\"><EJBComponent Name=\"servicecache-ejb-1.3.0.jar\" /><WebAppComponent Name=\"/CAC01000004/servicecache\" /></Application><Application Name=\"CAC07015100\"><EJBComponent Name=\"servicecache-ejb-1.3.0.jar\" /><WebAppComponent Name=\"/CAC07015100/servicecache\" /></Application></Domain>");
$insert=XML::XPath::XMLParser->new(xml=> "<Application Name=\"CAC07015108\" Name3=\"ff\" Name2=\"ff\"><test/></Application>");
my $root = $xp->parse;
$i=0;

print "#####avant\n";
Show($root,0);
print "\n#####fusion avec\n";
Show($insert->parse,0);

print "\n#####fusion ...\n";
Walk($root,"");
print "\n#####apres\n";
Show($root,0);

# affichage du contenu XML
sub Show{
my $root = shift;
my $level = shift;

foreach $child ($root->getChildNodes){
for (my $a=0;$a<$level;$a++){print "  ";}
print "<".$child->getName;
foreach $attrib ($child->getAttributeNodes){
print $attrib->toString;
}
print ">\n";

Show($child,$level+1);

for ($a=0;$a<$level;$a++){print "  ";}
print "</".$child->getName.">\n";
}
}

#Parcours de l'arborescence XML
sub Walk {
my $root = shift;
my $XMLParentString = shift;

foreach $node ($root->getChildNodes){
if ($node->getNodeType == ELEMENT_NODE()){
$XMLString = $XMLParentString . GetTextNode($node);

# test de $XMLString
print $XMLString."\n";

# l'événement recherché est trouvé
if($XMLString eq "<Domain Name=\"DOIN7L9R\"><Application Name=\"CAC07015108\">"){

$newnodes=($insert)->parse;

# L'arborescence XML ne peut avoir qu'une seule racine donc un seul fils
$newnode = $newnodes->getChildNode(1);

if ($newnode->getName ne $node->getName){
$root->insertAfter($newnodes, $node);
}
else{
#
# Fusion des attributs du node courant avec le nouveau
#

$isNew = 0;
$isMod = 0;

foreach $newattrib ($newnode->getAttributes){
$Traitement=0;
foreach $attrib ($node->getAttributes){
if($attrib->getName eq $newattrib->getName){
$Traitement = 1;
if($attrib->getNodeValue ne $newattrib->getNodeValue){
$attrib->setNodeValue($newattrib->getNodeValue);
}
}
}
if( not $Traitement){
$attrib=XML::XPath::Node::Attribute->new($newattrib->getName,$newattrib->getNodeValue);
$node->appendAttribute($attrib);
}
}
#
# ajout des fils du nouveau node au node courant
#
foreach $childnode ($newnode->getChildNodes){
$node->appendChild ( $childnode );
}
}
}
Walk($node,$XMLString);
}
}

}


# Fonction permettant d'afficher le node courant est tous ses pères
sub GetTextNode {
my $node = shift(@_);
my $result="<".$node->getName;
sub backwards { $a->getName cmp $b->getName; }
my @Attributes = sort backwards $node->getAttributes;
foreach my $attrib (@Attributes){
$result=$result." ".$attrib->getName."=\"".$attrib->getNodeValue."\"";
}
$result=$result.">";
return $result;
}
(:sourcend:)


Donnera cette sortie

%block bgcolor=#f0f0f0 font-family=monospace padding=5px%[@
#####avant
<Domain Name="DOIN7L9R">
  >>red<<
<Application Name="CAC07015108">%red%
      <EJBComponent Name="servicecache-ejb-1.3.0.jar">
      </EJBComponent>
      <WebAppComponent Name="/CAC01000004/servicecache">
      </WebAppComponent>
  </Application>
  <Application Name="CAC07015100">
      <EJBComponent Name="servicecache-ejb-1.3.0.jar">
      </EJBComponent>
      <WebAppComponent Name="/CAC07015100/servicecache">
      </WebAppComponent>
  </Application>
</Domain>

#####fusion avec
<Application Name="toto" Name3="ff" Name2="ff">
  <test>
  </test>
</Application>

#####fusion ...
<Domain Name="DOIN7L9R">
<Domain Name="DOIN7L9R"><Application Name="CAC07015108">
<Domain Name="DOIN7L9R"><Application Name="CAC07015108"><EJBComponent Name="servicecache-ejb-1.3.0.jar">
<Domain Name="DOIN7L9R"><Application Name="CAC07015108"><WebAppComponent Name="/CAC01000004/servicecache">
<Domain Name="DOIN7L9R"><Application Name="CAC07015108"><test>
<Domain Name="DOIN7L9R"><Application Name="CAC07015100">
<Domain Name="DOIN7L9R"><Application Name="CAC07015100"><EJBComponent Name="servicecache-ejb-1.3.0.jar">
<Domain Name="DOIN7L9R"><Application Name="CAC07015100"><WebAppComponent Name="/CAC07015100/servicecache">

#####apres
<Domain Name="DOIN7L9R">
  <Application Name="CAC07015108" Name3="ff" Name2="ff">
      <EJBComponent Name="servicecache-ejb-1.3.0.jar">
      </EJBComponent>
      <WebAppComponent Name="/CAC01000004/servicecache">
      </WebAppComponent>
      <test>
      </test>
  </Application>
  <Application Name="CAC07015100">
      <EJBComponent Name="servicecache-ejb-1.3.0.jar">
      </EJBComponent>
      <WebAppComponent Name="/CAC07015100/servicecache">
      </WebAppComponent>
  </Application>
</Domain>
@]
Edit - History - Print - Recent Changes - Search
Page last modified on June 04, 2007, at 11:52 AM