Nie radzę sobie z XML / LINQ. POmożecie?

0

Hi!

Oto mój kod:

  XElement contactsFromFile = XElement.Load(@"C:\!!FILMY!!\wiwi.xml");

            var rows = from row in contactsFromFile.Descendants("contact")
                       where row.Element("name").Value == "Maniek" &&
                            // row.Element("phone").Attribute("type").Value == "work"
                             row.Attribute("type").Value == "work"
                       select row.Element("phone").Value;
                         

            foreach (var r in rows)
            {
                label1.Text += r +"\n";
}

A tu XML:

<?xml version="1.0" encoding="utf-8"?>
<contacts>
  <contact>
    <name>Patrick Hines</name>
    <phone type="home">206-555-0144</phone>
    <phone type="work">425-555-0145</phone>
    <address>
      <street1>123 Main St</street1>
      <city>Mercer Island</city>
      <state>WA</state>
      <postal>68042</postal>
    </address>
  </contact>
  <contact>
    <name>Kazik</name>
    <phone type="home">206-555-0144</phone>
    <phone type="work">425-555-0145</phone>
    <address>
      <street1>Ulica Kazika 121</street1>
      <city>Ciechoicienk</city>
      <state>WA</state>
      <postal>68042</postal>
    </address>
  </contact>
  <contact>
    <name>Maniek</name>
    <phone type="home">206-222-0144</phone>
    <phone type="work">425-555-0145</phone>
    <address>
      <street1>Ulica Mańka 121</street1>
      <city>Ciechoicienk</city>
      <state>WA</state>
      <postal>68042</postal>
    </address>
  </contact>
  <contact>
    <name>Juzek</name>
    <phone type="home">206-111-0144</phone>
    <phone type="work">333-3333-0145</phone>
    <address>
      <street1>Ulica Juzka 121</street1>
      <city>Ciechoicienk</city>
      <state>WA</state>
      <postal>68042</postal>
    </address>
  </contact>
</contacts>

Jak wydobyć domowy (home) lub z pracy (work) telefon osobnika Maniek??

LL3

0
using System;
using System.IO;
using System.Linq;
using System.Xml.Linq;


class Program {
  static void Main() {
     try {
        var xml = XElement.Load("a.xml");
        var contacts = xml.Elements("contact");
        var Maniek = contacts.FirstOrDefault(e => e.Element("name").Value == "Maniek");
        if (Maniek == null)
          Console.WriteLine("brak takiego kontaktu");
        else {
           var phones = Maniek.Elements("phone");
           var homePhone = phones.FirstOrDefault(e => e.Attribute("type").Value == "home");
           var workPhone = phones.FirstOrDefault(e => e.Attribute("type").Value == "work");
           Console.WriteLine("telefon domowy: "+(homePhone==null ? "brak" : homePhone.Value));
           Console.WriteLine("telefon służbowy: "+(workPhone==null ? "brak" : workPhone.Value));
        }
     }
     catch (FileNotFoundException e) {
        Console.WriteLine(e.Message);
     }
  }
}
0

A co to jest e??? e nie jest zdefiniowane. Nie chodzi mi o e = error na koncu.

K...

0

e => e.Attribute("type").Value == "home" to wyrażenie lambda
phones.FirstOrDefault(e => e.Attribute("type").Value == "home"); oznacza tyle co: zwróć pierwszy znacznik ze zbioru phones którego atrybut type jest "home" albo nic.

0

Ja ten kod wklepalem i wlasnie kompilator mnie pyta o e. Co to jest e?

K...

A juz wiem, u mnie bylo EventArgs e i sie gryzly. Wszystko juz jest OK. Sorry za pomylke!!!

K...

0

Dzięks! DZIAŁA JAK TA LALA! Perfekcyjnie!

LL3

0

Bo zmienne w lambdach nazywa się q, a wyjątki z catcha ex, wtedy się nic nikomu nie gryzie.

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