Recherche par filtre dans un fichier XML

NikkyBoy Messages postés 2 Date d'inscription jeudi 6 novembre 2008 Statut Membre Dernière intervention 18 janvier 2010 - 18 janv. 2010 à 01:37
NikkyBoy Messages postés 2 Date d'inscription jeudi 6 novembre 2008 Statut Membre Dernière intervention 18 janvier 2010 - 18 janv. 2010 à 13:39
Bonjour a tous,
Ceci est mon premier message sur le forum, veuillez donc m'excuser si je ne suis pas trés précis.

Comme le titre le suggère je doit tout simplement utiliser des filtres pour chercher specifiquement une infos dans mon fichier xml que voici

<?xml version="1.0" encoding="utf-8" ?>

  <Country>
    <CountryCode>GB</CountryCode>
    <CountryName>United Kingdom</CountryName>
    <CapitalCity>London</CapitalCity>
    44


    <ContinentCode>EU</ContinentCode>
    <CurrencyCode>GBP</CurrencyCode>
    <Flag></Flag>
  </Country>

  <Country>
    <CountryCode>FR</CountryCode>
    <CountryName>France</CountryName>
    <CapitalCity>Paris</CapitalCity>
    33


    <ContinentCode>EU</ContinentCode>
    <CurrencyCode>EUR</CurrencyCode>
    <Flag></Flag>
  </Country>

  <Country>
    <CountryCode>ES</CountryCode>
    <CountryName>Spain</CountryName>
    <CapitalCity>Madrid</CapitalCity>
    34


    <ContinentCode>EU</ContinentCode>
    <CurrencyCode>EUR</CurrencyCode>
    <Flag></Flag>
  </Country>

  <Country>
    <CountryCode>CZ</CountryCode>
    <CountryName>Czech Republic</CountryName>
    <CapitalCity>Prague</CapitalCity>
    420


    <ContinentCode>EU</ContinentCode>
    <CurrencyCode>CZK</CurrencyCode>
    <Flag></Flag>
  </Country>

  <Country>
    <CountryCode>DE</CountryCode>
    <CountryName>Germany</CountryName>
    <CapitalCity>Berlin</CapitalCity>
    49


    <ContinentCode>EU</ContinentCode>
    <CurrencyCode>EUR</CurrencyCode>
    <Flag></Flag>
  </Country>

  <Country>
    <CountryCode>CN</CountryCode>
    <CountryName>China</CountryName>
    <CapitalCity>Beijin</CapitalCity>
    86


    <ContinentCode>AS</ContinentCode>
    <CurrencyCode>CNY</CurrencyCode>
    <Flag></Flag>
  </Country>

  <Country>
    <CountryCode>DK</CountryCode>
    <CountryName>Denmark</CountryName>
    <CapitalCity>Copenhagen</CapitalCity>
    45


    <ContinentCode>EU</ContinentCode>
    <CurrencyCode>DKK</CurrencyCode>
    <Flag></Flag>
  </Country>

  <Country>
    <CountryCode>GR</CountryCode>
    <CountryName>Greece</CountryName>
    <CapitalCity>Athens</CapitalCity>
    30


    <ContinentCode>EU</ContinentCode>
    <CurrencyCode>EUR</CurrencyCode>
    <Flag></Flag>
  </Country>

  <Country>
    <CountryCode>PL</CountryCode>
    <CountryName>Poland</CountryName>
    <CapitalCity>Warsaw</CapitalCity>
    48


    <ContinentCode>EU</ContinentCode>
    <CurrencyCode>PLN</CurrencyCode>
    <Flag></Flag>
  </Country>

  <Country>
    <CountryCode>RU</CountryCode>
    <CountryName>Russian Federation</CountryName>
    <CapitalCity>Moscow</CapitalCity>
    7


    <ContinentCode>AS</ContinentCode>
    <CurrencyCode>RUB</CurrencyCode>
    <Flag></Flag>
  </Country>

  <Country>
    <CountryCode>US</CountryCode>
    <CountryName>United States</CountryName>
    <CapitalCity>Washington</CapitalCity>
    1


    <ContinentCode>AM</ContinentCode>
    <CurrencyCode>USD</CurrencyCode>
    <Flag></Flag>
  </Country>

  <Country>
    <CountryCode>BR</CountryCode>
    <CountryName>Brazil</CountryName>
    <CapitalCity>Brasilia</CapitalCity>
    55


    <ContinentCode>AM</ContinentCode>
    <CurrencyCode>BRL</CurrencyCode>
    <Flag></Flag>
  </Country>


J'ai reussi à faire se que je voulais pour filtrer mon fichier et afficher seulement les Pays ayant pour monnaie commue l'Euro.

 protected void Button2_Click(object sender, EventArgs e)
    {
        XDocument xmlDoc = XDocument.Load(Server.MapPath(".") + "\\Data.xml");
        if (DropDownList1.SelectedIndex == 0)
        {
            var countries = from country in xmlDoc.Descendants("Country")
                            where country.Element("CurrencyCode").Value == DropDownList1.SelectedValue.ToString()
                            select new
                            {
                                Code = country.Element("CountryCode").Value,
                                Name = country.Element("CountryName").Value,
                                Capital = country.Element("CapitalCity").Value,
                            };
            TextBox1.Text = "";
            foreach (var country in countries)
            {
                TextBox1.Text = TextBox1.Text + "Code :" + country.Code + "   Name:" + country.Name + "   Capital :" + country.Capital + "\n" + "\n";
            }


Mon probleme étant de maintenant filtrer de la meme facon pour obtenir les Pays ayant pour Indicatif un nombre compris entre 40-50.
Cela peu paraitre tout bete, mais je n'arrive pas a trouver la solution.
Merci a celui ou celle qui essaiera de m'aider !

3 réponses

billou_13 Messages postés 860 Date d'inscription jeudi 4 mars 2004 Statut Membre Dernière intervention 19 août 2014 29
18 janv. 2010 à 10:03
Bonjour,

Au lieu de parcourir toi-même tous les noeuds et sélectionner ce qui t'intéressent, je te propose d'utiliser une chose bien plus pratique: les XPath.
Les requêtes XPath te permettent de "requêter" ton fichier XML [à la manière du SQL sur une base de données]. Le langage n'est pas le même mais la puissance et l'efficacité est au rendez-vous.

Tu pourras alors aisément développer tes deux besoins:
- afficher seulement les Pays ayant pour monnaie commue l'Euro
- obtenir les Pays ayant pour Indicatif un nombre compris entre 40-50
Et ceci, en une seule requête (pour chaque besoin bien sûr).

Pour ce faire, je ne vais pas rabacher les choses qui ont déjà été très bien expliquées auparavent.
C'est pourquoi je te propose le tutorial de Bidou qui devrait te combler: http://www.csharpfr.com/tutoriaux/XPATH-LANGUAGE_536.aspx.

Et si tu n'as pas assez d'info pour faire tes XPath, je te propose de recherche un petit tutoriel sur les XPath sur google.

PS: en plus, voici un petit utilitaire pour tester tes requêtes proposé par nsevero:
http://www.csharpfr.com/codes/TESTEUR-REQUETES-XPATH_46707.aspx

Bon développement sur C#,

Billou_13

--------------------------------------------------------------------
Connaître la réponse est une chose, savoir pourquoi en est une autre
---------------------
0
krimog Messages postés 1860 Date d'inscription lundi 28 novembre 2005 Statut Membre Dernière intervention 14 février 2015 49
18 janv. 2010 à 10:05
Salut

Il suffit d'ajouter deux autres conditions dans ta requête linq.

var countries = from country in xmlDoc.Descendants("Country")
    where country.Element("CurrencyCode").Value == DropDownList1.SelectedValue.ToString()
    && Convert.ToInt32(country.Element("PhoneCode")) >= 40
    && Convert.ToInt32(country.Element("PhoneCode")) <= 50
    select new
    {
        Code = country.Element("CountryCode").Value,
        Name = country.Element("CountryName").Value,
        Capital = coutry.Element("CapitalCity").Value
    };


Krimog : while (!(succeed = try())) ;
- Nous ne sommes pas des décodeurs ambulants. Le style SMS est prohibé. -
0
NikkyBoy Messages postés 2 Date d'inscription jeudi 6 novembre 2008 Statut Membre Dernière intervention 18 janvier 2010
18 janv. 2010 à 13:39
Merci à vous deux, je vais probablement reussir a faire se que je veux :)
0
Rejoignez-nous