IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XMLRAD Discussion :

Problème de chargement d'un fichier XML


Sujet :

XMLRAD

  1. #1
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 4
    Points : 4
    Points
    4
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    RDM
    RDM est déconnecté
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Points : 2 927
    Points
    2 927
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    FileCursor.GetValue('/TransXChange/Operators/LicensedOperator/OperatorShortName').

  3. #3
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    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 ?

  4. #4
    RDM
    RDM est déconnecté
    Membre émérite

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    1 424
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 424
    Points : 2 927
    Points
    2 927
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Candidat au Club
    Inscrit en
    Juillet 2005
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Juillet 2005
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    J'ai opté pour la facilité et j'ai donc utilisé la fonction CleanDefaultNamespace comme tu me l'as conseillé et cela fonctionne !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 05/03/2007, 14h21
  2. Réponses: 3
    Dernier message: 28/02/2006, 12h41
  3. Problème de lecture dans un fichier xml
    Par Pyra dans le forum Langage
    Réponses: 2
    Dernier message: 18/12/2005, 00h13
  4. Problème d'écriture dans un fichier xml
    Par vanoou dans le forum C++Builder
    Réponses: 1
    Dernier message: 13/07/2005, 02h28
  5. Réponses: 2
    Dernier message: 01/06/2004, 12h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo