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

C# Discussion :

[System.Xml.XPath] Parser un fichier xml


Sujet :

C#

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Par défaut [System.Xml.XPath] Parser un fichier xml
    Bonjour à tous!
    J'ai un petit soucis pour lire des données d'un fichier xml.
    Je voudrais juste sélectionner un noeud précis et extraire son attribut.
    Aprés lecture de plusieur post sur le forum j'ai essayé d'utiliser XPathDocument et XPathNavigator sans résultat.
    Voici mon fichier xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    <dossier>
    	<patient>
    		<nom>Arnaud</nom>
    		<prenom>David</prenom>
    		<age>22</age>
    		<poids></poids>
    		<adresse></adresse>
    		<email></email>
    	</patient>
    </dossier>
    Ainsi que mon source c# :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    using System;
    using System.Xml;
    using System.Xml.XPath;
     
    ...
     
    string xmlfile="chemin de mon fichier xml";
    XPathDocument docXML = new XPathDocument(xmlfile);
    XPathNavigator nav = docXML.CreateNavigator();
    nav.Matches("dossier/patient/nom");
    Console.WriteLine(nav.Value);
    Ce code m'affiche a l'écran : "ArnaudDavid22" !!!
    De plus nav.Matches("dossier/patient/nom"); retourne false !
    J'ai vu des sources qui utilisent XPathNodeIterator mais j'utilise la platerforme Mono et il n'existe pas dans XPathNodeIterator la fonction : Current.SelectSingleNode("nom du noeud").Value !
    Voici les liens sur XPathNodeIterator.Current et sur XPathNoteIterator de la doc mono.

    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Cet article devrait t'aider: http://support.microsoft.com/kb/307548


    A+

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Par défaut
    Ok merci pour cette réponse mais je voulais utiliser XPathDocument pour ne pas faire une lecture séquentielle.
    Sinon quand je test mon fichier avec un XmlTextReader et la propriété HasAttributes celle-ci me retourne false pour tout les noeuds! (même ceux qui ont des attributs).
    Le problème peut-il venir de la façon dont je créer le fichier xml?
    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
    26
     
    //Ma classe xml
    public void writeDataPatient(string Nom,string Prenom,string Age,string Poids,string Adresse,string Email)
    		{
    			strXMLDataPatient="<dossier>\n\t<patient>\n";
    			strXMLDataPatient+="\t\t<nom>"+Nom+"</nom>\n";
    			strXMLDataPatient+="\t\t<prenom>"+Prenom+"</prenom>\n";
    			strXMLDataPatient+="\t\t<age>"+Age+"</age>\n";
    			strXMLDataPatient+="\t\t<poids>"+Poids+"</poids>\n";
    			strXMLDataPatient+="\t\t<adresse>"+Adresse+"</adresse>\n";
    			strXMLDataPatient+="\t\t<email>"+Email+"</email>\n";
    			strXMLDataPatient+="\t</patient>";
    		}
     
    public void createXMLFile()
    	{
    		sw = File.CreateText(FILE_NAME);
              	sw.WriteLine("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
              	sw.WriteLine(strXMLDataPatient);
              	sw.WriteLine("</dossier>");
              	sw.Close();
    	}
     
    //MAIN qui instencie la classe xml
    xml.writeDataPatient(Entry_nom.Text,Entry_prenom.Text,Entry_age.Text,Entry_poids.Text,Entry_adresse.Text,Entry_email.Text);
    xml.createXMLFile();

  4. #4
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Pourquoi tu n'utilises pas les classes du Framework pour créer ton document XML ? comme XmlDocument par exemple...
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Par défaut
    Pourquoi tu n'utilises pas les classes du Framework pour créer ton document XML ? comme XmlDocument par exemple...
    Etant donné que je ne suis pas un pro de l'xml la solution la plus simple, au premier abord, ma paru de faire ligne par ligne le dossier xml sans avoir a me plongé dans la doc de System.Xml.
    Par la suite si la navigation dans mon fichier xml et plus simple grâce à XmlDocument je vais essayer de m'en servir.
    Cependant a quoi correspond le namespaceURI????
    Je sais que la BaseURI est le chemin d'accés au fichier. Quelle est la différence?
    Car si j'utilise XmlDocument, il faut passer le namespaceURI a chaque fois que l'on créer un noeud ou un attribut et je ne sais pas quoi mettre!

  6. #6
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Je n'ai jamais eu besoin d'utiliser les namespaces pour créer des fichiers XML.
    Peux tu poster le code que tu utilises ?
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Par défaut
    Ben justement j'ai juste regardé la doc et trouvé un source sur la toile :
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    using System;
    using System.Xml;
     
    namespace PavelTsekov
    {
     class MainClass
     {
      XmlDocument xmldoc;
      XmlNode xmlnode;
      XmlElement xmlelem;
      XmlElement xmlelem2;
      XmlText xmltext;
      static void Main(string[] args)
      {
       MainClass app=new MainClass();
      }
      public MainClass() //constructor
      {
       xmldoc=new XmlDocument();
       //let's add the XML declaration section
       xmlnode=xmldoc.CreateNode(XmlNodeType.XmlDeclaration,"","");
       xmldoc.AppendChild(xmlnode);
       //let's add the root element
       xmlelem=xmldoc.CreateElement("","ROOT","");
       xmltext=xmldoc.CreateTextNode("This is the text of the root element");
       xmlelem.AppendChild(xmltext);
       xmldoc.AppendChild(xmlelem);
       //let's add another element (child of the root)
       xmlelem2=xmldoc.CreateElement("","SampleElement","");
       xmltext=xmldoc.CreateTextNode("The text of the sample element");
       xmlelem2.AppendChild(xmltext);
       xmldoc.ChildNodes.Item(1).AppendChild(xmlelem2);
       //let's try to save the XML document in a file: C:\pavel.xml
       try
       {
        xmldoc.Save("c:\pavel.xml"); //I've chosen the c:\ for the resulting file pavel.xml
       }
       catch (Exception e)
       {
        Console.WriteLine(e.Message);
       }
       Console.ReadLine();
      }
     }
    }
    La il laisse une chaine vide pour le namespaceURI mais je trouve que ce n'est vraiment pas simple avec XMLDocument !!!!!!
    Est-ce que ma première méthode est vraiment mauvaise et impossible a lire efficacement par la suite ?????

  8. #8
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Par défaut
    Citation Envoyé par goddet Voir le message
    Est-ce que ma première méthode est vraiment mauvaise et impossible a lire efficacement par la suite ?????
    Essaie de peindre un mur avec une brosse pour les toilettes, tu vas finir par y arriver, mais tu admettras que ce n'est pas l'idéal quand même.
    Besoin d'un MessageBox amélioré ? InformationBox pour .NET 1.1, 2.0, 3.0, 3.5, 4.0 sous license Apache 2.0.

    Bonnes pratiques pour les accès aux données
    Débogage efficace en .NET
    LINQ to Objects : l'envers du décor

    Mon profil LinkedIn - MCT - MCPD WinForms - MCTS Applications Distribuées - MCTS WCF - MCTS WCF 4.0 - MCTS SQL Server 2008, Database Development - Mon blog - Twitter

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Par défaut
    D'accord...
    Mais dans le source que j'ai trouvé je ne comprend pas la différence entre un XMLNode et un XMLElement. De plus que le TextNode c'est ici l'attribut du noeud????
    Pourquoi ne pas utiliser justement CreateAttribute() ?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 109
    Par défaut
    Pour en revenir à mon problème de lecture de fichier je me suis rabattu sur XPathDocument (ayant trouvé un tuto dessus). Je suis donc arrivé à mes fins!
    Pour ceux que ca intérèsse, voici mon code :
    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
     
    public string readDataPatient(string filename,string data)
    		{
    			string res=null;
    			XPathDocument doc = new XPathDocument(filename);
    			XPathNavigator nav = doc.CreateNavigator();
    			XPathExpression expr; 
    			expr = nav.Compile("/dossier/patient/"+data);
    			XPathNodeIterator iterator = nav.Select(expr);
    			try
    			{
      				while (iterator.MoveNext())
      				{
         				XPathNavigator nav2 = iterator.Current.Clone();
         				res = nav2.Value;
      				}
    			}
    			catch(Exception ex) 
    			{
       				Console.WriteLine(ex.Message);
    			}
    			return res;
    		}
    Avec filename : le chemin de mon fichier xml
    data : le nom du noeud ou la donnée est à récupéré
    et res : la donnée récupérée

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/04/2008, 11h24
  2. Réponses: 3
    Dernier message: 06/08/2007, 03h44
  3. [DOM] (org.w3c.dom) copier un noeud d'un fichier XML dans un autre fichier XML
    Par snoop dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 13/02/2007, 17h22
  4. [XML] Comment parser ce fichier XML avec java !
    Par jlassira dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 13/03/2006, 12h56
  5. Importer le contenu un fichier xml dans un autre fichier xml
    Par gedeon555 dans le forum XML/XSL et SOAP
    Réponses: 5
    Dernier message: 27/07/2005, 11h49

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