banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GEODATA DAYS 2024

#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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9859
Site web

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

Yves
Membre du bureau
Lieu: Aix-les-Bains
Date d'inscription: 22 Mar 2006
Messages: 9859
Site web

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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

Hors ligne

 

Pied de page des forums

Powered by FluxBB