#1 Mon 17 May 2010 10:58
- lucclementSTR
- Participant occasionnel
- Lieu: Albi
- Date d'inscription: 12 Mar 2010
- Messages: 33
[SDI] - schéma xml complexe
Bonjour,
j'ai à disposition un xml dont le schéma est prédéfini et ne doit pas être modifié car standardisé iso19139.
Je souhaiterai intégrer dans les balises xml un enregistrement d'une table oracle: un attribut dans une balise.
Lors de la création du schéma xml (étape 3/4), je n'arrive pas à reproduire le schéma exact d'origine, il n'accepte pas la création de colonnes avec le même nom. De plus, il n'accepte pas certains caractère comme ":" en nom de colonne. Or c'est le cas dans mon modèle xml standardisé.
En voici un extrait:
<gmd:extent>
<gmd:EX_Extent>
<gmd:geographicElement>
<gmd:EX_GeographicBoundingBox>
<gmd:westBoundLongitude>
<gco:Decimal>2.33</gco:Decimal>
</gmd:westBoundLongitude>
<gmd:eastBoundLongitude>
<gco:Decimal>2.37</gco:Decimal>
</gmd:eastBoundLongitude>
<gmd:southBoundLatitude>
<gco:Decimal>48.98</gco:Decimal>
</gmd:southBoundLatitude>
<gmd:northBoundLatitude>
<gco:Decimal>48.99</gco:Decimal>
</gmd:northBoundLatitude>
</gmd:EX_GeographicBoundingBox>
</gmd:geographicElement>
</gmd:EX_Extent>
</gmd:extent>
Ici, comment préciser que 4 colonnes distinctes doivent s'appeler "gco:Decimal"?
Aussi, comment créer les balises supérieures, "gmd:southboundlatitude" par exemple?
Plus généralement, est-il possible d'utiliser le schéma exact d'un xml existant avec l'ensemble de sa structure et de ses balises puis de choisir les balises dans lesquelles les attributs d'un enregistrement de la table oracle vont être envoyés?
En espérant m'être bien exprimé(!).
Luc
Hors ligne
#2 Mon 17 May 2010 11:40
Re: [SDI] - schéma xml complexe
Bonjour,
Je ne comprend pas ce que tu entends par "Lors de la création du schéma xml", quel component as tu utilisé ?
Pour créer une fichier XML complexe il faut utiliser le components XML/tAdvancedFileOutputXML et le rattacher par un tMAP (pour gérer le contenu de la balise).
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#3 Mon 17 May 2010 11:55
- lucclementSTR
- Participant occasionnel
- Lieu: Albi
- Date d'inscription: 12 Mar 2010
- Messages: 33
Re: [SDI] - schéma xml complexe
Je ne comprend pas ce que tu entends par "Lors de la création du schéma xml"
Je parle de l'assistant de création d'un xml: volet référentiel/metadata/fichier xml
Hors ligne
#4 Mon 17 May 2010 13:54
- lucclementSTR
- Participant occasionnel
- Lieu: Albi
- Date d'inscription: 12 Mar 2010
- Messages: 33
Re: [SDI] - schéma xml complexe
Pour créer une fichier XML complexe il faut utiliser le components XML/tAdvancedFileOutputXML et le rattacher par un tMAP (pour gérer le contenu de la balise).
Merci Yves,
j'ai réussi à importer l'arbre du xml source dans le composant "tadvancedfileoutputxml" (clic-droit dans cible du lien).
J'ajoute les champs de la table dans le volet de droite en tant que "colonne associée" (cf. tadvanceoutput.jpg) en face des balises xml correspondantes.
Cependant, il me manque un paramètre de boucle ("l'élément de boucle est manquant" cf. parametre boucle manquant.JPG).
Que signifie cette erreur? Je ne voie pas sur quoi je dois faire une boucle, ni où spécifier le paramètre.
Merci déjà car cela m'a déjà enlever l'appréhension de ne pouvoir modifier le contenu des xml qu'en sql.
Voici un lien pour des captures des erreurs: http://dl.free.fr/jmDnZDS7T
Cordialement
Luc
Hors ligne
#5 Mon 17 May 2010 14:05
Re: [SDI] - schéma xml complexe
Luc,
Il faut cliquer droit sur un élément de l'arbre XML et choisir "élément de boucle". Par contre je ne sais pas quel élément choisir. Si tu n'as pas de boucle (ie un seul élément sera envoyé vers le component) tu peux en choisir qu'un, sinon si tu as plusieurs ligne dans ton flux, il faudra renvoyer une seule ligne vers ce component.
Y.
Yves Jacolin, bénévole de l'association GeoRezo.net, agit au nom et pour le compte de l'association - Partageons ce qui nous départage !! - GeoRezo vous aide ? Aidez GeoRezo !
Hors ligne
#6 Mon 17 May 2010 17:36
- lucclementSTR
- Participant occasionnel
- Lieu: Albi
- Date d'inscription: 12 Mar 2010
- Messages: 33
Re: [SDI] - schéma xml complexe
Si tu n'as pas de boucle (ie un seul élément sera envoyé vers le component) tu peux en choisir qu'un, sinon si tu as plusieurs ligne dans ton flux, il faudra renvoyer une seule ligne vers ce component
Merci Yves!
J'ai mis une boucle sur une balise quelconque. Je génère un xml par enregistrement et la boucle est sans effet sur le résultat: le job marche bien, problème résolu.
Dernier problème: au départ, lorsque j'importais l'arbre du modèle xml il me manquais toujours des éléments par rapport au modèle xml lorsque je l'éditais dans IE ou Notepad++...
Ainsi, lorsque l'on doit avoir des éléments identiques (plusieurs dates par exemple) mais que l'arbre importé n'en met qu'un seul il ne fallait pas mettre une boucle mais rajouter les sous-éléments à la main.
Donc, à tâtons, j'ai vu le rôle des attributs et comment rajouter des éléments et sous-éléments pour coller au mieux avec le modèle.
résultat: de beaux xml normés générés à la volée!
Merci!
Luc
Hors ligne
#7 Thu 29 July 2010 16:23
- lucclementSTR
- Participant occasionnel
- Lieu: Albi
- Date d'inscription: 12 Mar 2010
- Messages: 33
Re: [SDI] - schéma xml complexe
Bonjour,
cherchant à publier des métadonnées Inspire sur un catalogue geosource, je rencontre des difficultés pour paramétrer le composant sCataloguePublisher.
le job contient deux sous-job:
-Un premier s'occupe de la transformation des enregistrements d'une table oracle en fichiers XML.
Il stocke les fichiers en local.
Composants utilisés: tOracleInput, tmap, tAvancedFileOutputXML
-Un second sous-job doit publier les métadonnées sur le catalogue
(i.e geosource hébergé sur un serveur utilisant Tomcat)
Composants utilisés: sCataloguePublisher
Le sous-job contenant le composant précité s'exécute si le dernier composant du sous-job précédent (i.e tAvancedFileOutputXML) réussit à s'éxécuter.
cf. capture du component's designer: http://dl.free.fr/o3EXclVNI
A l'exécution du job, je rencontre l'avertissement suivant sur le composant sCatalogPublisher:
[statistics] connecting to socket on port 3680
[statistics] connected
log4j:WARN No appenders could be found for logger (org.apache.commons.httpclient.HttpClient).
log4j:WARN Please initialize the log4j system properly.
host parameter is null
sCataloguePublisher_1 | Metadata published.
[statistics] disconnected
Malheureusement, le job ne s'exécute pas correctement. certainement à cause d'une erreur de
-déroulement du job suite à l'avertissement
-ou d'un problème de connection au serveur d'application
-ou bien peut-être d'un problème de connection au compte d'administration de geosource
Or, j'ai vérifié que Geosource contienne bien
-dans le dossier WEB-INF le fichier log4j.cfg
-dans le dossier WEB-INF/lib le jar commons.http.client.jar
Je ne sais pas s'il faut que je modifie (et comment) le fichier de configuration de log4j
Une idée pour paramétrer le composant sCatalogPublisher? Je ne voie vraiment pas dans mon cas le moyen de remplir la propriété "metadata to publish" du composant.
cf. vidéo de l'exécution du job: http://dl.free.fr/lAFsgsWD3 (AVI, 18.2Mo)
Merci
Cordialement
Luc Clément
Hors ligne
#8 Thu 29 July 2010 17:05
- mcoudert
- Participant actif
- Lieu: Toulouse
- Date d'inscription: 16 Oct 2006
- Messages: 83
Re: [SDI] - schéma xml complexe
Bonjour Luc,
Tout d'abord concernant log4j il ne s'agit que de warnings donc rien de bloquant à priori.
Ensuite, ce qui me semble plus bloquant concerne le message suivant : "host parameter is null".
Il vous faut vérifier le paramètrage de votre nom d'hôte pour le composant de publication, sCataloguePublisher.
D'autre part, il me semble qu'il faudrait adapter le job afin de publier chaque fiche XML produite, et non faire une action unique à la fin du job comme c'est le cas dans le job actuel.
Le champ "metadata to publish" permet de récuperer une variable globale stockant la métadonnée produite dans le composant en amont (i.e. lors de l'utilisation des composants géo permettant de générer automatiquement des métadonnées).
Cordialement,
Mathieu
Hors ligne
#9 Fri 30 July 2010 11:58
- lucclementSTR
- Participant occasionnel
- Lieu: Albi
- Date d'inscription: 12 Mar 2010
- Messages: 33
Re: [SDI] - schéma xml complexe
Bonjour, merci pour ces indications.
D'autre part, il me semble qu'il faudrait adapter le job afin de publier chaque fiche XML produite, et non faire une action unique à la fin du job comme c'est le cas dans le job actuel.
J'ai fait un job séparé pour la publication dans le catalogue. http://dl.free.fr/gu8n2YU44 (jpg, 98Ko; imageshack en blacklist)
Pour adapter le job afin de publier chaque XML, j'utilise le composant tFileList qui lit un dossier et récupère un groupe de fichiers.
Je précise aussi que Geosource est hébergé sur un serveur intranet mais que le MPD de Geosource (dont la table metadata) est stockée sur une base qui se situe sur un autre serveur intranet.
J'ai paramétré le 2ème composant du job: sCatalogPublisher ainsi:
host: "http://171.17.9.153" (serveur sur le réseau intranet où est installé geosource) ; port:8080
Use account, username/password: admin/admin (compte dans geosource <> session serveur)
Catalog Type: GeoNework XML import
Metadata to publish: ((String)globalMap.get("tFileList_1_CURRENT_FILE"))
Servlet: geonetwork (tel que cela apparait dans gast)
Schema: iso19139
Group: 2 (identique à l'attribut "groupowner" de la table metadata du MPD de
geosource
GeoNetwork category identifier: 2
Le job s'exécute entièrement, la connection à Geonetwork s'effectue mais un message erreur se manifeste pour chaque fichier du dossier source traité:
org.talend.sdi.metadata.Catalogue | Bad status null
Le code du job est disponible ici:http://dl.free.fr/lZ51jq1IC ("new2.java", 18Ko)
Je ne voie pas trop d'où surgit cette erreur.
Est-ce un problème dû au fait que le MPD de geosource est stocké sur un autre serveur?
Est-ce un problème dû au champ "metadata to publish" qui serait erroné?
Dois-je m'abstenir d'utiliser le composant sCatalogPublisher et préférer un job où chaque fichier XML est inséré dans le champ data d'une nouvelle ligne de la table metadata (éventuellement en utilisant un composant XML, et composant pour insérer un fichier dans un champ de table oracle)??
Vidéo de l'exécution du job: http://dl.free.fr/oYBREF9zL (avi, 7Mo)
Merci de votre aide
Cordialement
Luc
Dernière modification par lucclementSTR (Fri 30 July 2010 13:09)
Hors ligne
#10 Fri 30 July 2010 14:23
- mcoudert
- Participant actif
- Lieu: Toulouse
- Date d'inscription: 16 Oct 2006
- Messages: 83
Re: [SDI] - schéma xml complexe
En utilisant le type (Catalogue type) XML import, il vous faut passer une variable globale contenant le XML de la métadonnée au champ "Metadata to publish", et non une variable globale correspondant au chemin vers le fichier XML de la métadonnée ((String)globalMap.get("tFileList_1_CURRENT_FILE")).
Soit il vous faut construire pour chaque fichier XML une variable globale correspondant au contenu du fichier, soit il vous faut utiliser l'autre type d'import (MEF Import) après avoir crée un fichier MEF contenant l'ensemble de vos fichiers XML.
Cordialement,
Mathieu
Hors ligne
#11 Fri 30 July 2010 14:33
- lucclementSTR
- Participant occasionnel
- Lieu: Albi
- Date d'inscription: 12 Mar 2010
- Messages: 33
Re: [SDI] - schéma xml complexe
J'aimerai effectivement passer le xml en variable globale.
Comment fait-on?
Est-ce que la variable se rechargera pour chaque nouveau XML à publier?
cordialement
Luc
Hors ligne
#12 Fri 30 July 2010 14:44
- lucclementSTR
- Participant occasionnel
- Lieu: Albi
- Date d'inscription: 12 Mar 2010
- Messages: 33
Re: [SDI] - schéma xml complexe
Comme variable globale possible pour la propriété metadata to publish, il y a de possible (ctrl+espace):
tFileList_1.CURRENT_FILE
tFileList_1.CURRENT_FILEPATH
tFileList_1.ERROR_MESSAGE
tFileList_1.NB_FILE
Hors ligne
#13 Tue 03 August 2010 11:00
- lucclementSTR
- Participant occasionnel
- Lieu: Albi
- Date d'inscription: 12 Mar 2010
- Messages: 33
Re: [SDI] - schéma xml complexe
Bonjour,
j'arrive à un job plus cohérent avec juste une erreur due à une variable mal choisie.
Je job parvient à lancer la publication des XML un à un à grâce à un composant "tFlowtoIterate".
Voici une capture image du job: https://docs.google.com/leaf?id=0B04ldw … amp;num=50
Par itération, le XML est créé puis entré dans une variable globale
Dans les paramètres du composant tSetGlobalVar, j'ai nommé une variable "XML" récupérant la configuration de l'arbre XML du composant tAdvancedOutputXML. Ainsi, la valeur de la variable appelée XML est: ((String)globalMap.get("tAdvancedFileOutputXML_1_MAP_"))
Puis dans les paramètres du composant tCatalogPublisher, dans le champ "metadata to publish", j'ai choisi la variable "XML". Le champ comporte alors: ((String)globalMap.get("XML")) .
Lorsque j'exécute le jon. La création du XML et la demande de publication marchent bien par itération. Ce qui est déjà un premier pas réussi pour le traitement de XML un par un.
Cependant, le job se termine par une erreur sur le composant tCatalogPublisher:
Exception in component sCataloguePublisher_1
java.lang.NullPointerException
at demo_oracle.oracle_geosource_marne_aval_0_1.Oracle_Geosource_Marne_aval.sCataloguePublisher_1Process(Oracle_Geosource_Marne_aval.java:10105)
at demo_oracle.oracle_geosource_marne_aval_0_1.Oracle_Geosource_Marne_aval.tOracleInput_1Process(Oracle_Geosource_Marne_aval.java:9888)
at demo_oracle.oracle_geosource_marne_aval_0_1.Oracle_Geosource_Marne_aval.runJobInTOS(Oracle_Geosource_Marne_aval.java:10293)
at demo_oracle.oracle_geosource_marne_aval_0_1.Oracle_Geosource_Marne_aval.main(Oracle_Geosource_Marne_aval.java:10186)
Il y aurait donc une erreur sur la variable à transmettre choisie. Actuellement, la variable globale telle que définie dans le composant tSetGlobalVar récupère la configuration de l'arbre XML: ((String)globalMap.get("tAdvancedFileOutputXML_1_MAP_")).
Il faudrait une variable qui récupère tout le contenu du document XML, pas son nom de fichier, ni son nom de dossier.... Laquelle?
Vidéo de la première itération du job: http://dl.free.fr/tzmbV8waW (avi, 7.5mo)
Merci de votre aide.
Cordialement
Luc Clément
Dernière modification par lucclementSTR (Tue 03 August 2010 13:21)
Hors ligne
#14 Tue 03 August 2010 14:54
- mcoudert
- Participant actif
- Lieu: Toulouse
- Date d'inscription: 16 Oct 2006
- Messages: 83
Re: [SDI] - schéma xml complexe
Bonjour,
En effet le contenu de la variable XML ne correspond pas au contenu du fichier XML mais à une propriété du fichier (en l'occurence son nom ou son dossier...).
Pour cela il faudrait créer un sous-job ou post-job qui utilise un composant pour lire le fichier XML produit ligne à ligne et créer ainsi une variable globale correspondant réellement au contenu du fichier XML. Ce composant pourrait être un tFileInputFullRow.
Ensuite, à l'aide d'un flux "Main" ou "principal" vous pouvez le relier à un tJavaFlex dans lequel il vous suffit de concaténer chaque ligne en entrée dans une variable globale définit dans le code initial du composant tJavaFlex.
Par exemple :
- dans la section "Code initial" du composant tJavaFlex :
Code:
// start part of your Java code globalMap.put("XML",""); String xml = "";
- dans la section "Code Principal" du composant tJavaFlex :
Code:
// here is the main part of the component, // a piece of code executed in the row // loop xml = xml+"\n\r"+row1.line;
- dans la section "Code final" du composant tJavaFlex :
Code:
// end of the component, outside/closing the loop globalMap.put("XML",xml);
Sur trigger "onComponentOk" sur le composant tJavaFlex, vous pouvez ensuite publier votre variable (contenu du fichier XML) dans le catalogue à l'aide du composant sCataloguePublisher.
Cordialement,
Mathieu Coudert
Hors ligne
#15 Wed 04 August 2010 11:20
- lucclementSTR
- Participant occasionnel
- Lieu: Albi
- Date d'inscription: 12 Mar 2010
- Messages: 33
Re: [SDI] - schéma xml complexe
Bonjour,
merci pour cette piste. J'essaie de mettre ce deuxième job en pratique.
Je l'ai ajouté à la suite du premier sous-job sur réussite du composant.
Capture: https://docs.google.com/leaf?id=0B04ldw … &hl=en (Oracle2 Geosource 4-08-10.JPG, 28Ko)
Le premier sous-job comprend les composants:
toracleinput
tmap
tadvancedoutputXML ( la variable associée au paramètre "configurer l'arbre xml" est _MAP_ )
tFlowToIterate (case "utilisation par défaut clé et valeur en variable globale" cochée)
[i]tSetGlobalVar clé: "XML" / valeur: ((String)globalMap.get("tAdvancedFileOutputXML_1_MAP_"))
Le deuxième sous-job débute par un trigger sur réussite du composant tSetGlobalVar.
Il comprend 3 composants:
tFileInputFullRow. Avec comme paramètre de nom de fichier: [i]((String)globalMap.get("XML"))
séparateur de ligne: "\n"
tJavaFlex avec les 3 parties de code précitées
Avec un trigger sur réussite du composant précédent:
sCatalogPublisher. Avec comme paramètre metadata to publish: ((String)globalMap.get("XML"))
A l'exécution du job, une erreur se produit au niveau du composant tFileInputFullRow:
[statistics] connecting to socket on port 3363
[statistics] connected
Exception in component tFileInputFullRow_1
java.io.FileNotFoundException:
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at org.talend.fileprocess.TOSDelimitedReader.<init>(TOSDelimitedReader.java:86)
at org.talend.fileprocess.FileInputDelimited.<init>(FileInputDelimited.java:166)
at demo_oracle.oracle_geosource_marne_aval_0_1.Oracle_Geosource_Marne_aval.tFileInputFullRow_1Process(Oracle_Geosource_Marne_aval.java:10482)
at demo_oracle.oracle_geosource_marne_aval_0_1.Oracle_Geosource_Marne_aval.tOracleInput_1Process(Oracle_Geosource_Marne_aval.java:10070)
at demo_oracle.oracle_geosource_marne_aval_0_1.Oracle_Geosource_Marne_aval.runJobInTOS(Oracle_Geosource_Marne_aval.java:10828)
at demo_oracle.oracle_geosource_marne_aval_0_1.Oracle_Geosource_Marne_aval.main(Oracle_Geosource_Marne_aval.java:10721)
Dois-je reconfigurer les variables des composants tFlowIterate et tSetGlobalVar? Ou bien sur le composant tFileInputFullRow?
Merci
Cdlt
Luc Clément
Dernière modification par lucclementSTR (Wed 04 August 2010 11:58)
Hors ligne
#16 Wed 04 August 2010 18:11
- lucclementSTR
- Participant occasionnel
- Lieu: Albi
- Date d'inscription: 12 Mar 2010
- Messages: 33
Re: [SDI] - schéma xml complexe
Bonjour,
merci Mathieu.
j'ai ajouté le sub-job conseillé avec une première variable globale qui contient tout le document XML et j'ai créé une 2nde variable globale contenant le chemin physique du fichier XML.
Cette 2nde variable est nécessaire pour définir le nom du fichier dans les paramètres du composant 'tFileInputFullRow".
Pour définir et utiliser cette 2nde variable:
En premier lieu, dans la table Oracle source, j'ai ajouté un champ "chemin_physique" contenant le chemin physique des XML sur le poste.
En deuxième lieu, je définie le champ "chemin_physique" de cette table comme variable globale personnalisée (appelée "VG") dans les paramètres basiques du composant tFlowToIterate.
Et en troisième lieu, dans le composant tFileInputFullRow" j'ai spécifié comme nom de fichier cette 2nde variable qui contient la valeur de ce champ pour l'enregistrement traité. Elle se note:
((String)globalMap.get("VG"))
Pour que cela fonctionne bien, il faut veiller que les noms de chaque fichiers XML soit égal à la l'attribut "chemin_physique" correspondant dans la table source.
Au final, le job s'exécute par itération et s'occupe de produire et publier les XML un par un.
Je remarque que le composant sCataloguePublisher n'écrase pas les métadonnées identiques. Lors de la tentative de publication d'une métadonnée déjà publiée, il se contente de mettre un warning 'bad status catalog'.
Dernière modification par lucclementSTR (Wed 04 August 2010 18:12)
Hors ligne