Sxml, Import Export de structures XML : Différence entre versions

De Wicri Manuel
imported>Jacques Ducloy
(Lecture d'un fichier contenant une suite d'enregistrements)
imported>Jacques Ducloy
(Lecture d'un fichier contenant une suite d'enregistrements)
 
(20 révisions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
 +
{{Wicri travaux|texte=cette page est la première réalisation d'un futur manuel d'utilisation de la [[bibliothèque Dilib]] }}
 
==Principes élémentaires==
 
==Principes élémentaires==
  
 
Si la chaîne d'entrée est constituée d'objets Xml bien formés, la construction d'un arbre XML peut se faire sans DTD (ni schéma).
 
Si la chaîne d'entrée est constituée d'objets Xml bien formés, la construction d'un arbre XML peut se faire sans DTD (ni schéma).
  
La philosophie Dilib impose souvent l'absence de sauts de ligne ou de tabulations pour l'utilisation de filtres sous Unix. Le parser Dilib proprement dit traite des objets Xml quelconques.
+
La philosophie Dilib impose souvent l'absence de sauts de ligne ou de tabulations pour l'utilisation de filtres sous Unix. Le parser Dilib proprement dit traite des objets XML quelconques.
  
==Conversion d'objets Xml en chaînes de caractère, et réciproquement==
+
===Conversion d'objets Xml en chaînes de caractère, et réciproquement===
  
 
Les fonctions d'entrées sorties utilisent un noyau de 2 procédures de conversion vers les chaînes (char *) de C.
 
Les fonctions d'entrées sorties utilisent un noyau de 2 procédures de conversion vers les chaînes (char *) de C.
Ligne 14 : Ligne 15 :
 
           SxmlNode *node;
 
           SxmlNode *node;
 
</source>
 
</source>
 +
 +
Attention, cette fonction renvoie un pointeur sur une chaîne dont la durée de vie n'est pas garantie (en particulier chaque appel à cette fonction génère une nouvelle valeur pointée). Lr programmeur dot gérer la pérennité.
 +
 
;Construction d'un arbre Sxml à partir d'une string.
 
;Construction d'un arbre Sxml à partir d'une string.
 
<source lang="c">
 
<source lang="c">
Ligne 21 : Ligne 25 :
  
 
==Entrées-sorties==
 
==Entrées-sorties==
 +
Les fonctions qui réalisent les entrées sorties sont réalisées à partir des fonctions précédentes et utilisent, pour les entrées, un lecteur, ou moteur de lecture (un SxmlRecordReader).
 +
 +
===Écritures ou exportation d'arbres Sxml===
  
Les fonctions qui réalisent les entrées sorties sont réalisées à partir des fonctions précédentes et utilisent un lecteur, ou moteur de lecture (un SxmlRecordReader).
 
===Cas simples===
 
Dans les cas simples, un lecteur implicite facilite les opérations.
 
 
*Impression d'un objet XML sur la sortie standard :
 
*Impression d'un objet XML sur la sortie standard :
 
<source lang="c">
 
<source lang="c">
Ligne 34 : Ligne 38 :
 
                   FILE *file;
 
                   FILE *file;
 
</source>
 
</source>
 +
 +
===Lecture d'un fichier contenant une suite d'enregistrements===
 +
 +
Le <code>SxmlRecordReader</code> sert à contrôler la gestion du flux d'entrées et l'appel au parser.
 +
Dans les cas simples, un lecteur implicite facilite les opérations (et rend transparent ce lecteur interne).
 +
 +
Une seule fonction est alors utile dans les cas simples : <code>SxmlInputGetDocumentElement</code>.
 +
 
*lecture du prochain document XML sur l'entrée standard.
 
*lecture du prochain document XML sur l'entrée standard.
 
<source lang="c">
 
<source lang="c">
     SxmlNode *SxmlInputNextDocumentElement();
+
     SxmlNode *SxmlInputGetDocumentElement();
 
</source>
 
</source>
===Lecture d'un fichier contenant une suite d'enregistrements===
+
Cette fonction retourne un pointeur sur la racine du document et la veleur NULL en fin de fichier.
Cette façon de procéder implique une explicitation du lecteur, un <code>SxmlRecordReader</code> qui hérite de la structure de base le <code>SxmlNode</code>. Un tel objet est manipulé à partir des opérations suivantes.
+
 
:;Déclaration:
+
==Exemples==
 +
 
 +
;Impression de tous les premiers fils ayant « a » pour tag.
 +
<source lang="c">
 +
#include "SxmlNode.h"
 +
main()
 +
{
 +
  SxmlNode *docu ,*son;
 +
  while((docu=SxmlInputGetDocumentElement()))
 +
    {
 +
      if (son=SxmlFirstChild(docu))
 +
        {if (SxmlNodeHasName(son,"a"))
 +
                {SxmlPrint(son);putchar('\n');
 +
    }}}
 +
}
 +
</source>
 +
;Ajout d'un nouvel élément à tous les documents.
 
<source lang="c">
 
<source lang="c">
SxmlRecordReader *myReader;
+
#include "SxmlNode.h"
 +
main()
 +
{
 +
  SxmlNode *docu;
 +
  while((docu=SxmlInputGetDocumentElement()))
 +
    {
 +
      SxmlNode *nouveauFils;
 +
      nouveauFils=XmlLeafCreate("a","nouveau");
 +
      SxmlAppendChild(docu,nouveauFils);
 +
      SxmlPrint(docu);
 +
      putchar('\n');
 +
    }
 +
}
 
</source>
 
</source>
:;Création:
+
;ou en écriture plus compacte :
 
<source lang="c">
 
<source lang="c">
myReader=SxmlRecordReaderCreate();
+
#include "SxmlNode.h"
 +
main()
 +
{
 +
  SxmlNode *docu;
 +
  while((docu=SxmlInputGetDocumentElement()))
 +
    {
 +
      SxmlAppendChild(docu,SxmlLeafCreate("a","nouveau"));
 +
      SxmlPrint(docu);
 +
      putchar('\n');
 +
    }
 +
}
 
</source>
 
</source>
:;Ouverture:
+
 
:Cette procédure utilise un paramètre de type chaîne qui désigne le chemin d'accès (''path'') au fichier qui sera exploité ultérieurement.
+
==Voir aussi==
 +
Pour en savoir plus sur les entrées sorties, voir sur Wicri/Outils :
 +
* [[wicri-outils.fr:Dilib, module SxmlNode, objet SxmlRecord|Dilib, module SxmlNode, objet SxmlRecord]]
 +
* [[Introduction à la programmation en C des arbres Xml]]
 +
[[Catégorie:Programmation XML en langage C]]

Version actuelle datée du 25 juin 2020 à 08:02

logo travaux cette page est la première réalisation d'un futur manuel d'utilisation de la bibliothèque Dilib

Principes élémentaires

Si la chaîne d'entrée est constituée d'objets Xml bien formés, la construction d'un arbre XML peut se faire sans DTD (ni schéma).

La philosophie Dilib impose souvent l'absence de sauts de ligne ou de tabulations pour l'utilisation de filtres sous Unix. Le parser Dilib proprement dit traite des objets XML quelconques.

Conversion d'objets Xml en chaînes de caractère, et réciproquement

Les fonctions d'entrées sorties utilisent un noyau de 2 procédures de conversion vers les chaînes (char *) de C.

Conversion d'un arbre Sxml en String
    char *SxmlToString(node);
          SxmlNode *node;

Attention, cette fonction renvoie un pointeur sur une chaîne dont la durée de vie n'est pas garantie (en particulier chaque appel à cette fonction génère une nouvelle valeur pointée). Lr programmeur dot gérer la pérennité.

Construction d'un arbre Sxml à partir d'une string.
    SxmlNode *SxmlFromString(str);
          char *str;

Entrées-sorties

Les fonctions qui réalisent les entrées sorties sont réalisées à partir des fonctions précédentes et utilisent, pour les entrées, un lecteur, ou moteur de lecture (un SxmlRecordReader).

Écritures ou exportation d'arbres Sxml

  • Impression d'un objet XML sur la sortie standard :
    SxmlPrint(node);
  • Impression d'un objet XML dans un fichier :
    SxmlFilePrint(node, file);
                  FILE *file;

Lecture d'un fichier contenant une suite d'enregistrements

Le SxmlRecordReader sert à contrôler la gestion du flux d'entrées et l'appel au parser. Dans les cas simples, un lecteur implicite facilite les opérations (et rend transparent ce lecteur interne).

Une seule fonction est alors utile dans les cas simples : SxmlInputGetDocumentElement.

  • lecture du prochain document XML sur l'entrée standard.
    SxmlNode *SxmlInputGetDocumentElement();

Cette fonction retourne un pointeur sur la racine du document et la veleur NULL en fin de fichier.

Exemples

Impression de tous les premiers fils ayant « a » pour tag.
#include "SxmlNode.h"
main()
{
  SxmlNode *docu ,*son;
  while((docu=SxmlInputGetDocumentElement()))
    {
       if (son=SxmlFirstChild(docu))
         {if (SxmlNodeHasName(son,"a"))
                 {SxmlPrint(son);putchar('\n');
    }}}
}
Ajout d'un nouvel élément à tous les documents.
#include "SxmlNode.h"
main()
{
  SxmlNode *docu;
  while((docu=SxmlInputGetDocumentElement()))
    {
       SxmlNode *nouveauFils;
       nouveauFils=XmlLeafCreate("a","nouveau");
       SxmlAppendChild(docu,nouveauFils);
       SxmlPrint(docu);
       putchar('\n');
    }
}
ou en écriture plus compacte 
#include "SxmlNode.h"
main()
{
  SxmlNode *docu;
  while((docu=SxmlInputGetDocumentElement()))
    {
       SxmlAppendChild(docu,SxmlLeafCreate("a","nouveau"));
       SxmlPrint(docu);
       putchar('\n');
    }
}

Voir aussi

Pour en savoir plus sur les entrées sorties, voir sur Wicri/Outils :