Recherche par filtre dans un fichier XML

Signaler
Messages postés
2
Date d'inscription
jeudi 6 novembre 2008
Statut
Membre
Dernière intervention
18 janvier 2010
-
Messages postés
2
Date d'inscription
jeudi 6 novembre 2008
Statut
Membre
Dernière intervention
18 janvier 2010
-
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

Messages postés
860
Date d'inscription
jeudi 4 mars 2004
Statut
Membre
Dernière intervention
19 août 2014
18
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
---------------------
Messages postés
1860
Date d'inscription
lundi 28 novembre 2005
Statut
Modérateur
Dernière intervention
14 février 2015
42
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é. -
Messages postés
2
Date d'inscription
jeudi 6 novembre 2008
Statut
Membre
Dernière intervention
18 janvier 2010

Merci à vous deux, je vais probablement reussir a faire se que je veux :)