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 markup

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:) http://www.grandville.net/pub/img/GB.gif 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">
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">

to:
   <Application Name="CAC07015108">
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:
  1. Fonction permettant d'afficher le node courant est tous ses pères
to:
  1. 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 :)

  1. !/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);

  1. 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";
	}

}

  1. 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);
		}		
	}

}

  1. 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

#####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