Krzysztof Radzimski

Pasja tworzenia

Proste operacje na XML z wykorzystaniem LINQ

09 lipiec
Opublikował Krzysztof Radzimski 9. lipca 2008 12:47

Pro LINQ: Language Integrated Query in C# 2008Zapewne wszyscy to już wiedzą, ale dla początkujących zamieszczam kody źródłowe prostych przykładów w języku C#.

LINQ dla XML praktycznie zdjął ze mnie większość zbednej pracy przy przetwarzaniu plików XML.
Biblioteka pl.cebip.gdf opublikowana na stronie http://gdf.org.pl jest w całości oparta o LINQ. Praktycznie właśnie dzieki tej technologii mogłem w bardzo krótkim czasie utworzyć mechanizmy do obsługi plików GDF, a całość zamknęła się w dwóch metodach w klasie bazowej.

Poniższe przykłady zawierają jedynie skrawek możliwości LINQ dla XML-a, ale już to pokazuje siłę tego rozwiązania. Ciekawym tematu polecam książkę wydawnictwa APress "Pro LINQ - Language Integrated Query in C# 2008" autorstwa Josepha C. Rattza. 

 

imageCAIWWRDC
Pobierz przykłady

 

1. Ten przykład pokazuje jak prosto - w porównaniu do System.Xml - można dodawać elementy tworząc plik XML.

            #region Przykład 1
            {
                Console.WriteLine("-------------");
                Console.WriteLine("Przykład 1");
                Console.WriteLine("-------------");
                XElement xBookParticipants =
                    new XElement("BookParticipants",
                        new XComment("To jest test komentarza"),
                        new XElement("BookParticipant",
                        new XAttribute("type", "Author"),
                        new XElement("FirstName", "Joe"),
                        new XElement("LastName", "Rattz")),
                new XElement("BookParticipant",
                    new XAttribute("type", "Editor"),
                    new XElement("FirstName", "Ewan"),
                    new XElement("LastName", "Buckingham"))
                );

                Console.WriteLine(xBookParticipants.ToString());
            }
            #endregion

2. Ten przykład pokazuje jak wskazać przestrzeń nazw.

           #region Przykład 2
            {
                Console.WriteLine("-------------");
                Console.WriteLine("Przykład 2");
                Console.WriteLine("-------------");

                XNamespace nameSpace = "http://www.linqdev.com";

                XElement xBookParticipants =
                    new XElement(nameSpace + "BookParticipants",
                        new XElement(nameSpace + "BookParticipant",
                            new XAttribute("type", "Author"),
                            new XElement(nameSpace + "FirstName", "Joe"),
                            new XElement(nameSpace + "LastName", "Rattz")),
                        new XElement(nameSpace + "BookParticipant",
                            new XAttribute("type", "Editor"),
                            new XElement(nameSpace + "FirstName", "Ewan"),
                            new XElement(nameSpace + "LastName", "Buckingham")));

                Console.WriteLine(xBookParticipants.ToString());

            }
            #endregion

3. Ten przykład pokazuje jak wskazać przestrzeń nazw oraz ustawić prefiks elementów.

            #region Przykład 3
            {
                Console.WriteLine("-------------");
                Console.WriteLine("Przykład 3");
                Console.WriteLine("-------------");

                XNamespace nameSpace = "http://www.linqdev.com";
                string prefix = "bk";

                XElement xBookParticipants =
                    new XElement(nameSpace + "BookParticipants",
                        new XAttribute(XNamespace.Xmlns + prefix, nameSpace),
                        new XElement(nameSpace + "BookParticipant",
                            new XAttribute("type", "Author"),
                            new XElement(nameSpace + "FirstName", "Joe"),
                            new XElement(nameSpace + "LastName", "Rattz")),
                        new XElement(nameSpace + "BookParticipant",
                            new XAttribute("type", "Editor"),
                            new XElement(nameSpace + "FirstName", "Ewan"),
                            new XElement(nameSpace + "LastName", "Buckingham")));

                Console.WriteLine(xBookParticipants.ToString());
            }
            #endregion

4. Ten przykład pokazuje jak wskazać przestrzeń nazw, ustawić prefiks elementów oraz lokalizację pliku XSD.

            #region Przykład 4
            {
                Console.WriteLine("----------------------------------");
                Console.WriteLine("Przykład 4 - Lokalizacja pliku XSD");
                Console.WriteLine("----------------------------------");

                XNamespace nameSpace = "http://www.linqdev.com";
                string prefix = "bk";

                XNamespace xsi = "http://www.w3.org/2001/XMLSchema-instance";

                XElement xBookParticipants =
                    new XElement(nameSpace + "BookParticipants",
                        new XAttribute(XNamespace.Xmlns + prefix, nameSpace),
                        new XAttribute(XNamespace.Xmlns + "xsi", xsi),
                        new XAttribute(xsi + "schemaLocation", nameSpace),
                        new XElement(nameSpace + "BookParticipant",
                            new XAttribute("type", "Author"),
                            new XElement(nameSpace + "FirstName", "Joe"),
                            new XElement(nameSpace + "LastName", "Rattz")),
                        new XElement(nameSpace + "BookParticipant",
                            new XAttribute("type", "Editor"),
                            new XElement(nameSpace + "FirstName", "Ewan"),
                            new XElement(nameSpace + "LastName", "Buckingham")));

                Console.WriteLine(xBookParticipants.ToString());
            }
            #endregion

5. Ten przykład pokazuje użycie klasy XDocument (analogicznie jak XElement w przykładzie pierwszym)

            #region Przykład 5
            {
                Console.WriteLine("----------------------");
                Console.WriteLine("Przykład 5 - XDocument");
                Console.WriteLine("----------------------");
                XDocument xDocument = new XDocument(
                    new XElement("BookParticipants",
                    new XElement("BookParticipant",
                    new XAttribute("type", "Author"),
                    new XElement("FirstName", "Joe"),
                    new XElement("LastName", "Rattz")),
                    new XElement("BookParticipant",
                    new XAttribute("type", "Editor"),
                    new XElement("FirstName", "Ewan"),
                    new XElement("LastName", "Buckingham"))));
                Console.WriteLine(xDocument.ToString());
            }
            #endregion

6. Ten przykład pokazuje jak utworzyć, a następnie wczytać i "odpytać" za pomocą klauzuli where.

            #region Przykład 6
            {
                Console.WriteLine("-------------");
                Console.WriteLine("Przykład 6");
                Console.WriteLine("-------------");
                XElement root = new XElement("root",
                    new XAttribute("atrybut", "Wartość"),
                    new XElement("Ala",
                        new XAttribute("rodzaj", "c1")
                        ),
                    new XElement("Ala",
                        new XAttribute("rodzaj", "c2")
                        ),
                    new XCData("<html><head></head><body>sdsdsd</body></html>"),
                    new XText("dfdfdfdfdfdfdf")
                    );                
                root.Save("C:\\test.xml");

                XElement root2 = XElement.Load("C:\\test.xml");
                var q = from xe in root2.Descendants("Ala")
                        where xe.Attribute("rodzaj").Value == "c2" ||
                              xe.Attribute("rodzaj").Value == "c1"
                        select xe;

                if (q.Count() > 0)
                    foreach (XElement e1 in q)
                    {
                        Console.WriteLine(e1.Attribute("rodzaj").Value);
                    }

                System.Diagnostics.Process.Start("C:\\test.xml");
            }
            #endregion

7. Ten przykład pokazuje jak w analogiczny sposób można "odpytać" kolekcję ciągów (w zasadzie większość kolekcji)

            #region Przykład 7
            {
                Console.WriteLine("-------------");
                Console.WriteLine("Przykład 7");
                Console.WriteLine("-------------");
                Collection<string> c = new Collection<string>();

                c.Add("ala");
                c.Add("ma");
                c.Add("kota");

                var q = from xe in c
                        where xe == "ala"
                        select xe;

                if (q.Count() > 0)
                {
                    foreach (string s in q)
                    {
                        Console.WriteLine(s);
                    }
                }
            }
            #endregion

8. Ten przykład pokazuje jak w analogiczny do poprzedniego przykładu można "odpytać" kolekcję obiektów klasy

            #region Przykład 8
            {
                Console.WriteLine("-------------");
                Console.WriteLine("Przykład 8");
                Console.WriteLine("-------------");
                Collection<Klasa1> c = new Collection<Klasa1>();

                c.Add(new Klasa1() { Property1 = "ala", Property2 = 1 });
                c.Add(new Klasa1() { Property1 = "ma", Property2 = 2 });
                c.Add(new Klasa1() { Property1 = "kota", Property2 = 3 });

                var q = from xe in c
                        where xe.Property2 == 2
                        select xe;

                
                IEnumerable<Klasa1> c2 = q as IEnumerable<Klasa1>;
                if (c2 != null)
                    if (c2.Count() > 0)
                    {
                        foreach (Klasa1 s in c2)
                        {
                            Console.WriteLine(s.Property1);
                        }
                    }                
            }
            #endregion

jeżeli Klasa1 to

    internal class Klasa1
    {
        public string Property1 { get; set; }
        public int Property2 { get; set; }
    }
 

Tagi: | Kategorie: Programowanie

Wyślij link na adres e-mail | Link do tego postu | RSSRSS comment feed