FAQ XMLRADConsultez toutes les FAQ

Nombre d'auteurs : 4, nombre de questions : 55, dernière mise à jour : 26 octobre 2006 

 
OuvrirSommaireXMLGram

Soit le document XML suivant

 
Sélectionnez
<document>
  <datas>
    <data>data1</data>
    <data>data2</data>
    <data>data3</data>
   </datas>
</document>

Pour charger ce fichier, on utilise l'instruction File

 
Sélectionnez
<File Name="MyData">
  <Method>LOAD</Method>
  <FileName>MyData.xml</FileName>
  <Select>/document/datas</Select>
  <FieldName>datas</FieldName>
  <Destination>Output</Destination>
</File>

Avec un chemin relatif, le XMLPath du XMLModule courrant sera utilsé pour charger le fichier.

Eviter de coder en dur les chemins. Utilisez une entrée dans les InitParams pour les spécifier:

 
Sélectionnez
<InitParams>
  <XMLC>
     ...
  </XMLC>
  <MyProject>
    <DataPath>D:\MyProject\Data\</DataPath>
  </MyProject>
</InitParams>

Et utiliser une propriété modèle:

 
Sélectionnez
<FileName>{$DataPath}MyData.xml</FileName>
Créé le 6 septembre 2004  par RDM

Soit le docurment XML Suivant:

 
Sélectionnez

<document>
  <datas>
    <data>data1</data>
    <data>data2</data>
    <data>data3</data>
   </datas>
</document>

Pour charger ce fichier, vous utilisez l'instruction FileExtract comme suit

 
Sélectionnez

<FileExtract Name="MyData">
  <FileName>MyData.xml</FileName>
  <Select>/document/datas</Select>
</FileExtract>

L'instruction FileExtract est maintenant obsolète. Vous devez utiliser l'instruction File à la place.

 
Sélectionnez

<File Name="MyData">
  <Method>LOAD</Method>
  <FileName>MyData.xml</FileName>
  <Select>/document/datas</Select>
  <FieldName>datas</FieldName>
  <Destination>Output</Destination>
</File>
Créé le 13 septembre 2004  par RDM

Utilisez les modèles de propriétés (Tempalte Properties) dans la propriété Path de la XMLInstruction File

les Tempalte Properties sont remplacées à l'exécution par les valeurs du Context.
Pour utiliser les Template Properties, vous devez vous assurez que la valeur est dans le Context.

Pour la XMLInstruction File, les développeurs peuvent utiliser les template properties dans la propriété Path pour paramétrer une partie du chemin du fichier.

Un exemple simple:

 
Sélectionnez

<File Name="LoadMyFile">
  <Method>LOAD</Method>
  <Path>{$XMLC_DefaultDataDir}MyFile.xml</Path>
  ...
</File>

Ce premier exemple charge un fichier nommé MyFile.xml à partir du chemin XMLC_DefaultDataDir. Le framework XMLCLX met automatiquement cette constante dans le Context.

Vous pouvez déclarer vos propres contantes en utilisant le fichier de configuration GlobalParams.
Les valeurs de GlobalParams sont automatiquement mises dans le Context, et peuvent être surchargées par les paramètres HTTP à l'execution.

Un exemple avancé:

 
Sélectionnez

<Assign Name="Params">
  <Fields>
    <Field>
      <Destination>Context</Destination>
      <Name>MyDataPath</Name>
      <Source>InitParams</Source>
      <SourceField>MyDataPath</SourceField>
    </Field>
  </Fields>
</Assign>
<File Name="LoadMyFile">
  <Method>LOAD</Method>
  <Path>{$MyDataPath}MyFile.xml</Path>
  ...
</File>

Cet exemple montre une combinaison simple de XMLInstructions Assign et File.
La XMLInstruction Assign copie MyDataPath des InitParams vers le Context.
La Valeur copiée est alors utilisée par la XMLInstruction File.

Créé le 17 septembre 2004  par RDM

La XMLInstruction File a une propriété Select qui contient le XPath pour séléectionner une partie du document XML.

Exemple:

 
Sélectionnez

<File Name="Contacts">
  <Method>LOAD</Method>
  <FileName>{$XMLC_DefaultDataDir}\Contacts.xml</FileName>
  <Cached>FALSE</Cached>
  <Destination>OUTPUT</Destination>
  <FieldName>Contacts</FieldName>
  <Select>/Contacts/Contact[(position() >= 1) and (position() < 10)]</Select>
</File>

Cet exemple d'instruction File sélectionne les 10 premiers éléments Contact du document XML Contacts.xml et les ajoute dans l'Output XML

Pour aller plus loin:

Vous pouvez utiliser les modèles de propriétés (Template properties) dans la propriété Select pour paramétrer le XPath.

Créé le 20 septembre 2004  par RDM

Préfixez le nom du champ avec le caractère @, comme pour un XPath standard.

L'instruction Assign créera alors un attribut dans l'élément conteneur.

Exemple:

 
Sélectionnez

<Assign Name="Params">
  <Fields>
    <Field>
      <Destination>OUTPUT</Destination>
      <Name>@Test</Name>
      <Source>CONTEXT</Source>
      <SourceField>XMLC_ShortDate</SourceField>
      <Value />
    </Field>
  </Fields>
</Assign>

Le fragement suivant est créé:

 
Sélectionnez

<document>
  ...
  <Params Test="12/16/2003">
     <Field2>Value2</Field2>
  </Params>
</document>

Vous pouvez utiliser n'importe quelle valeur authorisée pour les propriétés Source, SourceField et Value.

Une autre façon d'ajouter un attribut dans OutputDoc est d'utiliser l'objet XMLCursor dans un gestionnaire d'événement:

Delphi
Sélectionnez
Output.SetAttributeValue('Test', Context.GetValue('XMLC_ShortDate'));
JScript
Sélectionnez
Output.SetAttributeValue("Test", Context.GetValue("XMLC_ShortDate"));
C#
Sélectionnez
Output.SetAttributeValue("Test", Context.GetValue("XMLC_ShortDate"));
Java
Sélectionnez
Output.setAttributeValue("Test", context.getValue("XMLC_ShortDate"));

Recommandation: Privilégiez l'instruction Assign et le XMLGram plutôt que la programmation dans un gestionnaire d'événement chaque fois qu'il est possible. (= Pas besoin de recompilation, meilleur description, évolutivité, maitennance)

Créé le 21 septembre 2004  par RDM

L'instruction DBExtract utilise les ordres SQL pour récupérer les enreigistrements du serveur SQL et construire le document XML correspondant.
Chaque colonne retournée à partir d'un enregistrement soit être correctement nommé, car le nom du champ est utilisé comme nom de l'élément XML.

Les fonctions d'aggrégat SQL comme COUNT, MIN ou SUM ne retourne pas de noms corrects, et donc, le document XML ne peut être construit.

Lorsque l'on utilise les fonctions d'aggrégat, les colonnes doivent être renommées en utilisant le mot clé SQL "AS".

 
Sélectionnez

SELECT COUNT(PERSON.PSN_ID) AS COUNT_PERSON
FROM PERSON PERSON

A l'exécution, un élement XML sera créé contenant le nombre d'enregistrement retourés.

 
Sélectionnez

<COUNT_PERSON>30</COUNT_PERSON>
Créé le 23 septembre 2004  par RDM

Dans la conteneur du DBExtract (OutputDoc) il y a des infos:

 
Sélectionnez
<publishersS EOF="1" StartingRow="0" LastRow="8" RowCount="9" MaxRows="10" RecordName="publishers">
  • EOF indique que l'on est arrivé à la fin du SELECT
  • StartingRow indique à partir de quel enregistrement on effectue le fetch.
  • Last Row indique jusqu'à quel enregistrement on a fetché.
  • RowCount indique le nombre d'enregistrements fetchés
  • MaxRows indique le nombre d'enregistrement maximals fetchés pour ce DBExtract.

Cependant le RowCount limité au MaxRows car on ne fetch pas forcément tous les enregs pour un ecran. sauf si on met MaxRows à -1 (mais il y a quand meme une sécurité à 10000).

Le plus fiable et ce qui est recommandé reste quand même de faire un Select count. Sur de l'interbase c'est pas forcément le plus rapide (car il scanne physiquement les enregs) mais sur d'autres SGBD (SQLServer) ca reste très rapide (tables systèmes).

Créé le 2 novembre 2004  par RDM

Il est relativement simple de faire une ProgressBar (barre de progression) sur une extraction de données en la mattant en tant que fille de l'instruction DBExtract. Cependant pour un processus autre (génération de statistiques, appel d'un programme xeterne, etc.) il faut programmer un peu.

Il vaut une instruction Progress dans votre XMLGram que l'on va appeler MyProgressBar et dans le code ou se situe votre processus on va récupérer l'instruction et l'appeler manuellement:

Delphi
Sélectionnez

var
  MyProgresBar: IXMLinstruction;
begin
  MyProgressBar := XMLGram.GetXMLInstruction('MyProgressBar');
  if MyProgressBar = nil then
    XMLRequest.RaiseError('cannot find MyProgressBar', 'MyProcess');
  for I := 1 to 10 do
  begin
    Sleep(1000); // ou votre processus
    MyProgressBar.Process(Context, InputDoc, OutputDoc);
  end;
end;
JScript
Sélectionnez

  MyProgressBar = XMLGram.GetXMLInstruction("MyProgressBar");
  if (MyProgressBar == null)
    XMLRequest.RaiseError("cannot find MyProgressBar", "MyProcess");
  for (i = 0; i < 10; i++)
  {
    // votre processus
    MyProgressBar.Process(Context, InputDoc, OutputDoc);
  }
C#
Sélectionnez

  IXMLInstruction MyProgressBar = XMLGram.GetXMLInstruction("MyProgressBar");
  if (MyProgressBar == null)
    XMLRequest.RaiseError("cannot find MyProgressBar", "MyProcess");
  for (int i = 0; i < 10; i++)
  {
    // votre processus
    MyProgressBar.Process(Context, InputDoc, OutputDoc);
  }
Java
Sélectionnez

  IXMLInstruction myProgressBar = xmlGram.getXMLInstruction("MyProgressBar");
  if (myProgressBar == null)
    xmlRequest.raiseError("cannot find MyProgressBar", "MyProcess");
  for (int i = 0; i < 10; i++)
  {
    // votre processus
    myProgressBar.process(Context, InputDoc, OutputDoc);
  }
Créé le 14 octobre 2005  par RDM
  

Les sources présentées sur cette page sont libres de droits et vous pouvez les utiliser à votre convenance. Par contre, la page de présentation constitue une œuvre intellectuelle protégée par les droits d'auteur. Copyright © 2005 Developpez. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.