XML (struktura) i LINQ to XML

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

1

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)

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

1

@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 :).

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...

0

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

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...

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