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

Web & réseau Delphi Discussion :

Prise de tete avec xml


Sujet :

Web & réseau Delphi

  1. #1
    Nouveau membre du Club
    Prise de tete avec xml
    Bonjour,
    J'ai une adresse pour récupérer un fichier xml qui me donne toutes les possibilités de mon appareil photo (serveur local de l'appareil photo). J'essaie d'exploiter ce XML en le mettant dans un TXMLDocument, mais quand je cherche un noeud que je sais exister, je ne trouve rien.
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
     
    procedure TForm1.Button1Click(Sender: TObject);
    var
      HTTPClient:TIdHTTP;
      St:TStringStream;
      Response:String;
      XMLDocument:TXMLDocument;
      LNodeElement, LNode: IXMLNode;
    begin
      HTTPClient := TidHTTP.Create;
      St:=TStringStream.Create;
      try
        Response := HTTPClient.Get('http://192.168.122.1:64321/scalarwebapi_dd.xml');
        St.WriteString(Response);
        XMLDocument:=TXMLDocument.Create(nil);
        XMLDocument.LoadFromStream(St);//.FileName:='http://192.168.122.1:64321/scalarwebapi_dd.xm';
        XMLDocument.Active:=true;
        LNodeElement := XMLDocument.ChildNodes.FindNode('serviceId');
        memo1.Lines.Add(Response);
      finally
        HTTPClient.Free;
        St.Free;
        XMLDocument.Free;
      end;
    end;


    Je ne comprends vraiment pas. Merci de vos avis éclairés.
    Michel

  2. #2
    Membre habitué
    Salut,

    je en sais pas si c'est obligatoire mais tu peux ajouter le type d'encodage TXMLDocument.Encoding par exemple UTF8. Je ne suis pas sûre si le "loadFromStream" est capable de la mettre (pas moyen de regarder les sources pour le moment)

    Est-ce que ChildNodes te donne tous les nœuds du documents, ou bien seulement les nœuds enfant du root ?
    J'en avais il y a quelques temps, je me souviens que je devais parcourir l'arbre pour trouver le bon nœud. Mais il y a certainement des routines plus fonctionnelles maintenant. Tu es dans quelle version de Delphi ?

  3. #3
    Rédacteur/Modérateur

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    LNodeElement := XMLDocument.DocumentElement.ChildNodes.FindNode('serviceId');



  4. #4
    Nouveau membre du Club
    Je travaille avec Delphi 10.2
    Déja bizarrement il ne faut pas mettre XMLDocument:TXMLDocument mais XMLDocument:IXMLDocument sinon j'ai une erreur de pointer avec ChildNodes. Du coup je ne peux pas voir le contenu de XMLDocument au débogage.
    Sinon j'ai corrigé,
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    LNodeElement := XMLDocument.DocumentElement.ChildNodes.FindNode('serviceId');

    C'est toujours pareil, grrrrr
    Je vais être obligé de faire mon propre gestionnaire de XML :-(, l'horreur.
    Il doit bien y avoir un moyen de transférer une chaine string dans un TXMLDocument ?? Et ensuite d'explorer tranquillement.
    Merci de vos conseils?
    Pour l'instant mon code est:
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    procedure TForm1.Button1Click(Sender: TObject);
    var
      HTTPClient:TIdHTTP;
      St:TStringStream;
      Response:String;
      XMLDocument:IXMLDocument;
      LNodeElement: IXMLNode;
    begin
      HTTPClient := TidHTTP.Create;
      St:=TStringStream.Create;
      try
        Response := HTTPClient.Get('http://192.168.122.1:64321/scalarwebapi_dd.xml');
        St.WriteString(Response);
        XMLDocument:=TXMLDocument.Create(nil);
        XMLDocument.LoadFromStream(St);//.FileName:='http://192.168.122.1:64321/scalarwebapi_dd.xm';
        XMLDocument.Active:=true;
        LNodeElement := XMLDocument.DocumentElement.ChildNodes.FindNode('UDN');
        memo1.Lines.Add(Response);
      finally
        HTTPClient.Free;
        St.Free;
    //    XMLDocument.Free;
      end;
    end;

  5. #5
    Modérateur

    Bonjour,
    Avant le XMLDocument.LoadFromStream(St);, un St.Position := 0; ne change-t-il rien ?
    Delphi 5 Pro - Delphi 10.3.2 Rio Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  6. #6
    Rédacteur/Modérateur

    Un exemple de fichier peut-être ...

  7. #7
    Membre habitué
    Citation Envoyé par tourlourou Voir le message
    Bonjour,
    Avant le XMLDocument.LoadFromStream(St);, un St.Position := 0; ne change-t-il rien ?
    Je parie sur ta réponse, c'est un classique

  8. #8
    Membre émérite
    Si le nœud n'est pas directement sous la racine, tu ne le trouveras jamais avec cette méthode à moins de parcourir tous les nœuds.
    Mais tu peux utiliser XPath

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    Node := XMlDocument.selectSingleNode('//serviceId');