XML tout simplement
vendredi 24 mars 2000
Introduction
PYX est un modèle simple pour l'échange de données XML entre processus. C'est en
quelque sorte un SAX du pauvre.
PYX ne prétend pas modéliser toute l'information contenue dans un
document XML. Il transmet un sous-ensemble raisonnable de cette information,
qui peut être utilisé pour vérifier la qualité du XML, produire des rapports et, sous certaines
conditions, recréer un document XML (ou le document d'origine modifié).
PYX permet le traitement de documents par des outils de traitement de texte classique tel
que awk, sed ou Perl, et notamment l'écriture de "one-liners" beaucoup plus facilement qu'avec
SAX, le DOM ou autre.
Depuis le premier article décrivant PYX des implémentations Python, Perl et Java
sont apparues.
Détails techniques
Pour les anciens, PYX s'inspire fortement du format produit par nsgmls, le parser
SGML de James Clark. La différence majeure est que les attributs sont
affichés après le nom de l'élément.
Un processeur Pyxie lit un document XML et produit en sortie les événements suivants, un
par ligne :
-
début d'élément,
-
fin d'élément,
-
attribut,
-
texte,
-
processing instruction,
Le premier caractère de chaque ligne donne le type d'événement:
(| début d'élément |
)| fin d'élément |
A| attribut |
-| texte |
?| processing instruction |
Le nom de l'élément suit immédiatement la parenthèse, le texte suit
immédiatement le tiret, A est suivi du nom de l'attribut puis d'un espace puis de sa valeur, ? est
suivi de la cible, d'un espace puis de la processing instruction. Le texte comprend les espaces non-significatifs inclus dans le balisage (les retours a la ligne sont représentés par "\n").
Il est important de noter certains événements ne sont pas pris en compte, par exemple les
commentaires XML, ou les débuts ou fin de section CDATA. Il n'est donc pas garanti de pouvoir
recréer le document original a partir du flot PYX. En pratique, pour des documents "simples", par
exemple crées automatiquement à partir d'une base de données il est souvent possible de générer
le flot PYX, effectuer des transformations simples, et recréer le document en sortie.
Par exemple le document suivant:
<Person>
<?A4TypeSetter PageBreak?>
<Surname>McGrath</Surname>
<Given>Sean</Given>
<e-mail type="internet">sean@digitome.com</e-mail>
</Person>
donne en sortie le flot:
(Person
-\n
?A4TypeSetter PageBreak
-\n
(Surname
-McGrath
)Surname
-\n
(Given
-Sean
)Given
-\n
(e-mail
Atype internet
-sean@digitome.com
)e-mail
-\n
)Person
One-liners
PYX est particulièrement adapté a la création de "one-liners" qui permettent d'extraire
efficacement des informations d'un fichier XML.
Quelques exemples, utilisant divers outils de génération d'un flot PYX:
Compter le nombre d'occurrence de l'élément speech dans Hamlet:
xmln hamlet.xml | grep ^(speech$
Compter le nombre de mots (dans le texte uniquement) d'un
document:
xmln fig1.xml | grep "^-" | awk "{print substr($0,2)}"
Enfin comment afficher la liste des éléments utilisés dans
un document XML et leur fréquence d'utilisation:
pyx file.xml | perl -n -e '$nb{$1}++ if( m/\A\((.*)\n/);
END { map { print "$_ used $nb{$_} time(s)\n";} sort keys %nb;}'
Un exemple plus complexe: ex_pyx, utilisant pyxw
pour régénérer le document en sortie.
Implémentations
PYX a été implémenté en:
-
Python (la version originale): la librairie Pyxie, ainsi que xmln (utilisant un parser non-validant et
xmlv (utilisant un parser validant), outils produisant un flot
Pyxie,
-
Perl: le module XML::PYX,
contient une librairie PYX et les outils pyx (utilisant un parser
non-validant, base sur XML::Parser) et pyxv (utilisant un parser
validant, nécessite XML::Parser::Checker), outils produisant un flot
Pyxie, ainsi que pyxw qui crée un document XML à partir d'un flot
Pyxie,
-
Java: PYXToSAX permet à une
application SAX d'utiliser un parser PYX et SAXToPYX permet
d'utiliser un parser SAX pour produire un flot PYX.
Liens (en anglais)
Contact m.v.rodriguez@ieee.org |