Filtrowanie danych z pliku XML

0

Witam. Mam za zadanie z pliku XML o następującej stukturze

<oferty>
  <oferta>
       <nazwa>a</nazwa>
       <region>b</region>
       <data>c</data>ax
   .....
  </oferta>
</oferty

wybrać tylko te oferty, które sprecyzuje użytkownik po regionie.
Na początku wpadł mi do głowy pomysł żeby stworzyć klasę z kolekacjami - tam upchać xml'a i filtrować po listach, ale wydaje mi się, żę są lepsze sposoby. I tutaj moje pytanie: Czy da się to wykonać Od razu na pliku xml spakowanym do obiektu klasy XmlDocument ? Jeżeli tak, to jakie są na to gotowe metody ? Będę wdzięczny za jakiś przykładowy sample :) Pozdrawiam

0

Jeśli możesz, to użyj Linq. Poniżej umieszczam przykładowe rozwiązanie. Nie jestem specjalistą w tej dziedzinie - być może istnieje lepsze rozwiązanie.
Przypuśćmy, że masz taki plik:

<oferty>
  <oferta>
    <nazwa>a</nazwa>
    <region>b</region>
    <data>c</data>
  </oferta>
  <oferta>
    <nazwa>a</nazwa>
    <region>b1</region>
    <data>c</data>
  </oferta>
  <oferta>
    <nazwa>aa</nazwa>
    <region>b</region>
    <data>c2</data>
  </oferta>
  <oferta>
    <nazwa>aa</nazwa>
    <region>b</region>
    <data>c</data>
  </oferta>
  <oferta>
    <nazwa>a</nazwa>
    <region>b</region>
    <data>ccc</data>
  </oferta>
</oferty>

Dołącz poniższe przestrzenie nazw:

using System.Xml.Linq;
using System.Linq;

Wczytanie i pobranie odpowiednich danych:

            XDocument document = XDocument.Load(@"j:\test.xml");
            var oferty = from oferta in document.Descendants(XName.Get("oferta"))
                         where oferta.Element("nazwa").Value == "a"
                         select new
                         {
                             Nazwa = oferta.Element("nazwa").Value,
                             Region = oferta.Element("region").Value,
                             Data = oferta.Element("data").Value
                         };
            foreach (var oferta in oferty)
            {
                Console.WriteLine("{0},{1},{2}", oferta.Nazwa, oferta.Region, oferta.Data);
            }

Jakiej wersji .NET używasz ?

0

używam framework 3.5. Rozwiązanie z użyciem Linq jest genialne. Dzięki za pomoc.

0
using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;

public struct oferta
{
    public string nazwa;
    public string data;
    public string region;
};

[XmlRoot("oferty")]
public class oferty : List<oferta>
{
    public oferty() : base() { }
    public oferty(int capacity) : base(capacity) { }
};

//...................

oferty o;
XmlSerializer xs = new XmlSerializer(typeof(oferty));
using (FileStream fs = File.OpenRead("oferta.xml"))
{
    o = (oferty)xs.Deserialize(fs);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1