Précédent   Forum des professionnels en informatique > Webmasters - Développement Web > Outils > XMLRAD
XMLRAD Environnement de développement Web XML/XSL. Avant de poster -> F.A.Q XMLRAD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/08/2006, 18h09   #1
Invité de passage
 
Inscription : juillet 2005
Messages : 4
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 4
Points : 1
Points : 1
Par défaut Problème de chargement d'un fichier XML

Bonjour,

J'ai un problème lors de la lecture d'un fichier xml.

J'essaie de lire ce fichier grâce à l'instruction Load de XMLCursor :

FileCursor := TXMLCursor.Create;
FileCursor.Load('c:\linear.xml');

Jusque la, cela fonctionne, mais le problème arrive lorsque je veux faire un SELECT dans le flux, cela ne marche pas:

FileCursor.Select('/TransXChange/Operators/LicensedOperator').GetValue('OperatorShortName').
Ceci me renvoie du vide alors qu'il y a bien quelque chose dans 'OperatorShortName'.

J'ai trouvé que le problème provennait du premier noeu du fichier:
Code :
1
2
<TransXChange xmlns="http://www.transxchange.org.uk/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.transxchange.org.uk/
http://www.transxchange.org.uk/schema/2.0/TransXChange_registration.xsd" xmlns:apd="http://www.govtalk.gov.uk/people/AddressAndPersonalDetails" xml:lang="en" CreationDateTime="2004-06-09T14:20:00-05:00" ModificationDateTime="2004-06-09T14:20:00-05:00" Modification="new" RevisionNumber="0" FileName="linear.xml" SchemaVersion="2.0" MappingSystem="TOID" LocationSystem="Grid" RegistrationDocument="true">
Ce noeu contient apparemment des liens sur un schema qui permet la validation du document. Je ne connais pas trop le principe mais en tout cas, lorsque j'enleve ces attributs (xmlns,xmlns: xsi,xsi:schemaLocation) de ce noeu, j'arrive à lire le fichier et le SELECT que j'essayais de faire précedemment fonctionne.

Donc, auriez vous la solution pour réussir à lire ce type de fichier avec un XMLCursor ?

Je vous remercie d'avance pour votre aide.
PANAYE Nicolas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 10h29   #2
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
Le problème vient du namespace par défaut: xmlns="http://www.transxchange.org.uk/"

si tu le retires tu vas pouvoir naviguer correctement avec un select

d'autre part tu peux directement faire:
Code :
FileCursor.GetValue('/TransXChange/Operators/LicensedOperator/OperatorShortName').
__________________
RDM
Tout Est Relatif
Rubrique XMLRAD: http://xmlrad.developpez.com
FAQ XMLRAD: http://xmlrad.developpez.com/faq/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 11h11   #3
Invité de passage
 
Inscription : juillet 2005
Messages : 4
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 4
Points : 1
Points : 1
Merci pour ta réponse.

Pourrais tu m'expliquer en quoi le "xmlns="http://www.transxchange.org.uk/" empeche de faire un simple SELECT dans le flux car je ne saisis pas le principe.

D'autre part, j'ai essayé ta méthode avec le GetValue mais cela ne fonctionne pas non plus. De toute façon, je ne vois pas comment parcourir un flux facilement sans un SELECT car j'aurais besoin de parcourir par exemple tout les "LicensedOperator" qui sont dans le noeux "operators", et un GetValue ne va me renvoyer que le premier il me semble?

La seule solution serait donc d'enlever le xmlns="http://www.transxchange.org.uk/" en ouvrant le fichier une première fois dans le code, puis relire le fichier avec le XMLCursor.Load ?
PANAYE Nicolas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 13h44   #4
RDM
Membre Expert
 
Inscription : mars 2002
Messages : 1 426
Détails du profil
Informations forums :
Inscription : mars 2002
Messages : 1 426
Points : 1 546
Points : 1 546
Envoyer un message via ICQ à RDM
si un namespace explicite est déclaré, tu peux faire un Select corect en faisant:
/document/myns:myelement/data

le problème vient du namespace par défaut qui qaulifie automatiquement le noeud courant et les sous noeuds avec ce namespace.
pour le select arrive a fonctionner il faudrait introduire le namespace dan le Context XPath du select pour qu'il arrive a le sélectionner.
Le problème c'est que tu peux définir un namespace par défaut a tous les niveaux et pour tous les noeuds:
Code :
1
2
3
4
5
6
7
8
9
<document xmlns="http://url0">
  <element1 xmlns="http://url1">
    <element2 xmlns="http://url2">
      <element3 xmlns="http://url3">
        <data xmlns="http://url4">value</data>
      </element3>
    </element2>
  </element1>
</document>
donc il faudrait pour chaque élement récupérer le namespace par défaut pour l'introduire dans ce Context XPath et ce à chaque descente d'un niveau... bref ingérable,

http://www.topxml.com/people/bosley/defaultns.asp

ou alors en rescannant la chaine XPath étape par étape

http://weblogs.asp.net/pglavich/arch...09/278565.aspx

donc le mieux reste de virer le namespace par défaut.
dans XMLUtils tu as une fonction jsutement pour cela:
CleanDefaultNamespace

Pour le GetValue c'est effectivement pour récupérer une valeur unitaire. mais comme je voyais "Select('').GetValue", pour moi c'est équivalent a un seul GetValue.
__________________
RDM
Tout Est Relatif
Rubrique XMLRAD: http://xmlrad.developpez.com
FAQ XMLRAD: http://xmlrad.developpez.com/faq/
RDM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/08/2006, 16h17   #5
Invité de passage
 
Inscription : juillet 2005
Messages : 4
Détails du profil
Informations forums :
Inscription : juillet 2005
Messages : 4
Points : 1
Points : 1
J'ai opté pour la facilité et j'ai donc utilisé la fonction CleanDefaultNamespace comme tu me l'as conseillé et cela fonctionne !

Code :
FileCursor.LoadXML(CleanDefaultNameSpace(FileCursor.ContainerXML));
Pour info, dans la version XMLRADR1 je n'ai pas trouvé la fonction CleanDefaultNamespace dans XMLUtils mais dans SoapOperations.

En tout cas, merci pour toutes ces infos.
PANAYE Nicolas est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 21h56.


 
 
 
 
Partenaires

Hébergement Web