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

Odpowiedz Nowy wątek
LL3
2011-09-09 14:03
LL3
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

Pozostało 580 znaków

2011-09-09 18:33

Rejestracja: 16 lat temu

Ostatnio: 20 godzin temu

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);
     }
  }
}
Nie za dużo tych var'ów? ;) - stfu 2011-09-09 19:26
pewnie dałoby się w postaci jednolinijkowca, ale po co? - Azarien 2011-09-10 08:56

Pozostało 580 znaków

K...
2011-09-09 22:32
K...
0

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

K...

Może po prostu zaopatrz się w jakąś książkę o .NET 3.5/4. - Rev 2011-09-09 22:58

Pozostało 580 znaków

2011-09-10 11:37

Rejestracja: 9 lat temu

Ostatnio: 2 tygodnie temu

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.

Pozostało 580 znaków

K...
2011-09-10 13:37
K...
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...

Pozostało 580 znaków

LL3
2011-09-10 14:39
LL3
0

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

LL3

Pozostało 580 znaków

2011-09-10 18:21
Moderator

Rejestracja: 12 lat temu

Ostatnio: 4 minuty temu

Lokalizacja: Wrocław

0

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


"HUMAN BEINGS MAKE LIFE SO INTERESTING. DO YOU KNOW, THAT IN A UNIVERSE SO FULL OF WONDERS, THEY HAVE MANAGED TO INVENT BOREDOM."

Pozostało 580 znaków

Odpowiedz

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