Zapewne 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.
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; }
}