FAQ XMLRADConsultez toutes les FAQ
Nombre d'auteurs : 4, nombre de questions : 55, dernière mise à jour : 26 octobre 2006
- Comment extraire un fichier XML du disque vers le document Output ?
- Comment convertir l'instruction FileExtract en instruction File ?
- Comment utiliser une variable/constante comme chemin dans une XMLInstruction File ?
- Comment Ajouter une partie d'un document XML et pas le document entier en utilisant l'instruction File ?
- Comment créer des attributs dans l'OutputDoc en utilisant l'instruction Assign ?
- Comment utiliser les fonctions d'aggrégats SQL dans un DBExtract ?
- Comment Récupérer le nombre d'enregistrements d'un DBExtract ?
- Comment faire une progressbar sur un processus autre qu'une extraction de données ?
Soit le document XML suivant
<
document
>
<
datas
>
<
data
>
data1<
/
data
>
<
data
>
data2<
/
data
>
<
data
>
data3<
/
data
>
<
/
datas
>
<
/
document
>
Pour charger ce fichier, on utilise l'instruction File
<
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:
<
InitParams
>
<
XMLC
>
...
<
/
XMLC
>
<
MyProject
>
<
DataPath
>
D:\MyProject\Data\<
/
DataPath
>
<
/
MyProject
>
<
/
InitParams
>
Et utiliser une propriété modèle:
<
FileName
>
{$DataPath}MyData.xml<
/
FileName
>
Soit le docurment XML Suivant:
<
document
>
<
datas
>
<
data
>
data1<
/
data
>
<
data
>
data2<
/
data
>
<
data
>
data3<
/
data
>
<
/
datas
>
<
/
document
>
Pour charger ce fichier, vous utilisez l'instruction FileExtract comme suit
<
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.
<
File
Name
=
"
MyData
"
>
<
Method
>
LOAD<
/
Method
>
<
FileName
>
MyData.xml<
/
FileName
>
<
Select
>
/document/datas<
/
Select
>
<
FieldName
>
datas<
/
FieldName
>
<
Destination
>
Output<
/
Destination
>
<
/
File
>
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:
<
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é:
<
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.
La XMLInstruction File a une propriété Select qui contient le XPath pour séléectionner une partie du document XML.
Exemple:
<
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.
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:
<
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éé:
<
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:
Output.SetAttributeValue('
Test
'
, Context.GetValue('
XMLC_ShortDate
'
));
Output.
SetAttributeValue
("
Test
"
,
Context.
GetValue
("
XMLC_ShortDate
"
));
Output.
SetAttributeValue
("
Test
"
,
Context.
GetValue
("
XMLC_ShortDate
"
));
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)
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".
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.
<
COUNT_PERSON>
30
<
/
COUNT_PERSON>
Dans la conteneur du DBExtract (OutputDoc) il y a des infos:
<
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).
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:
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
;
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);
}
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);
}
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);
}