XML (struktura) i LINQ to XML

Odpowiedz Nowy wątek
2011-07-13 13:04
Aks
0

Mam problem: Buduje plik XML, który ma mi zastąpić bazę danych. Danych nie jest dużo (ok. 400 rekordów każdy po kilkanaście pól). Problem w tym że nie wiem:

  • co stosować
  • kiedy stosować

XElement czy XAttribute.

Nie wiem jak zbudować odpowiednio strukturę pliku XML, tak żeby była poprawna i łatwo się ją odczytywało z LINQ (w miarę proste zapytania).

Ja zbudowałem XML niemal wyłącznie na XElement (kilkanaście pozycji) i mam problemy z postawieniem właściwego query. Nie wiem czy dobrze buduje plik....

Mam tak:

XDocument doc = new XDocument(
new XDeclaration......
new XElement("listanarzedzi",

   new XElement("wiertarki",
      new XElement("marka", "Black & Decker"),
      new XElement("rokProdukcji","2010"),
      new XElement("opisProduktu.............................. i tak jeszcze ok. 10 XElement
      )),
  // następny produkt
  .........

  // następny produkt
  .........

  // następny produkt
  .........

  // następny produkt
  .........

)));
doc.Save("narzedzia.xml");

Czy to jest dobre podejście? (dobra struktura XML). Jak widać nie używam XAttribute.

Jak odczytać rok produkcji lub opisProduktu wszystkich wiertartek firmy Bosch ?

DZIEKI ZA POMOC!

Aks

Pozostało 580 znaków

2011-07-13 13:43
msm
0

Nie prościej byłoby zapisać ten plik XML w zewnętrznym pliku/zasobach i wczytać przez XDocument.Load(file) (nie musiałbyś też go zapisywać później)?

Tak, jest to poprawny dokument XML. Atrybuty to taka "dodatkowa" cecha XML-a, używanie elementów zamiast nich w niczym nie zaszkodzi (możliwości mają praktycznie takie same oprócz tego że atrybuty nie mogą zawierać elementów podrzędnych. Same atrybuty zostały wprowadzone głównie dla zwiększenia czytelności dla człowieka i zmniejszenia rozmiarów plików wynikowych.

Nazwałeś XElement 'wiertarki' - jeśli to znaczy że wszystkie wiertarki tam wrzucasz to struktura jest 'trochę' bez sensu... Zakładam że tam miała być wiertarka i opisuje pojedyńczą wiertarkę.

Jak odczytać rok produkcji lub opisProduktu wszystkich wiertartek firmy Bosch ?

Z głowy bym to napisał jakoś tak (wyjdzie trochę złożone zapytanie):

doc.Element("listanarzedzi")
    .Elements("wiertarka")
    .Where((x)=>x.Element("marka").Value == "bochs")
    .Select((x)=>x.Element("rokProdukcji"));

(pisane bez kompilowania więc mogą być drobne błędy)

edytowany 5x, ostatnio: msm, 2011-07-13 13:48
obiekt XDocument nawet nie jest potrzebny, bo XElement też ma metody .Load i .Save - Azarien 2011-07-14 10:53

Pozostało 580 znaków

2011-07-13 16:32
Aks
0

Uparłem się na XML, bo chce się nauczyć LINQ.

Dzieki! Nie lubię zapisu typu lambda ;) Ale nic przerobię sobie. Używałem zapytań z książek lub przykłądów z Internetu i dostaje query.Count() = 0 (czyli brak wyników). Innym razem wyskakują mi różne błędy (uruchomienia).

Co do wiertarek. Wiertarek jest około 60, ale są też piły, wyrzynarki, opalarki, wkrętarki i inne elektronarzędzia. Nie chciałem wrzucać wszystkiego do jednego worka, tylko zrobić grupy / mały porządek /.

Aks

Pozostało 580 znaków

2011-07-13 20:45
msm
0

@up - dobry pomysł żeby zrobić porządek, ale jeśli robisz porządek to rób do końca:

masz obecnie coś w stylu

<wiertarki>
    <marka>...</marka>
    <rokProdukcji>...</rokProdukcji>
    <foo>...</foo>
</wiertarki>

I teraz bądź tu mądry jak dodać kolejną wiertarkę - musiałbyś zrobić coś w stylu:

<wiertarki>
    <marka>...</marka>
    <rokProdukcji>...</rokProdukcji>
    <foo>...</foo>
    <marka>...</marka>
    <rokProdukcji>...</rokProdukcji>
    <foo>...</foo>
</wiertarki>

a to już jest bardzo zły do parsowania kod.

Jeśli chciałbyś mieć ładną strukturę z podziałem na wiertarki możesz zrobić coś w rodzaju:

<wiertarki>
    <wiertarka>
        <marka>...</marka>
        <rokProdukcji>...</rokProdukcji>
        <foo>...</foo>
    </wiertarka>
    <wiertarka>
        <marka>...</marka>
        <rokProdukcji>...</rokProdukcji>
        <foo>...</foo>
    </wiertarka>
</wiertarki>

Uparłem się na XML, bo chce się nauczyć LINQ.

LINQ to nie tylko XML służy ogólnie do odpytywania IEnumerable. Warto się go nauczyć bo jest wygodny, ale...

Dzieki! Nie lubię zapisu typu lambda

Ale pod warunkiem że lambdy nie są ci obce bo bez nich LINQ to męczarnia :).

edytowany 1x, ostatnio: msm, 2011-07-13 20:46
Da się w ogóle używać LINQ bez lambd? - somekind 2011-07-14 00:22
Zamieniając każdą lambdę na metodę klasy. Masochizm. - msm 2011-07-14 08:24
w C++/CLI to jedyny sposób. da się, ale. - Azarien 2011-07-14 10:54

Pozostało 580 znaków

2011-07-14 20:04
Komax
0

Hej!, tu Komax!

Przy okazji tematu LINQ...............Znacie dobre źródło wiedzy na temat tworzenia zapytań LINQ (też potrzebuje do XML, ale zapytania oczywiście są uniwersalne).

K...

Pozostało 580 znaków

2011-07-14 20:22
Rev
0

W google jest milion poradników w stylu: "100 przykładów linq w ...". Próbowałeś?


Pozostało 580 znaków

2011-07-14 20:41
Komax
0

Hej!, tu Komax!

Tak słyszałem o Google, ponoć dobre, ale nie używam ;)

Za szybko kliknąłem ENTER, a chciałem dopisać:

  • po polsku :)
  • dla początkujących
  • głównie pod kątem XML

K...

A co, angielskiego w szkole nie miałeś? - Rev 2011-07-14 21:37
Stary, bez angielskiego nic się nie nauczysz. - siararadek 2011-07-14 23:09

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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