WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   Xml to Linq (https://www.wn.se/forum/showthread.php?t=35418)

peterbf 2009-02-27 14:14

Zupp fellas.

Min kund har följande Xml-dokument (mycket mycket större, visar endast behövlig mängd):
Kod:

<root>
 <y2009>
 <m2>
 <t>
 <d>25</d>
 <v1>269,27</v1>
 <v2>231,57</v2>
 <v3>226,63</v3>
 </t>
 <t>
 <d>26</d>
 <v1>267,38</v1>
 <v2>232,50</v2>
 <v3>231,57</v3>
 </t>
 </m2>
<y2009>

Jag vet att filen har väldigt dålig struktur, och man hade kunnat göra allt mycket enklare. Men nu är det som det är och kunden tillåter inga ändringar i strukturen (tydligen en massa flash-filer som hämtar data från denna fil).

<y2009> = Året då "posten" läggs till.
<m2> = Månaden då "posten" läggs till, m2 = februari.
<t> = Ingen aning, antagligen nån sorts wrapper.
<d> = Dagen då "posten" läggs till.
<v1>, <v2>, <v3> = Värden för dagen då "posten" läggs till.

Det kunden vill kunna göra är att via ett formulär, lägga till fler värden vid dagens datum. Värdena måste komma i följd, finns endast ett värde vid en dag, d.v.s. <v1>, så ska den skapa <v2> and so forth.

Jag har inte kommit långt själv. Jag har lyckats penetrera dokumentet och hamnat inne i rätt månad (<mx>). Men då kommer ju en massa <t>, det jag måste göra är att på nåt sätt iterera genom dessa för att hitta dagens datum inne i <d>, och därefter, på nåt sätt, kolla hur många värden det finns; och lägga till värdet man postar i formuläret i rätt ordning.

Ni har antagligen följdfrågor, så skicka de till mig i ett kuvert så uppdaterar jag huvudtråden därefter ;-)

My present code:
Kod:

    XDocument document = XDocument.Load(Server.MapPath("~/termPrice.xml"));

    String todaysYear = "y" + DateTime.Now.Year.ToString();
    String todaysMonth = "m" + DateTime.Now.Month.ToString();
    var todaysDay = DateTime.Now.ToString("dd");

    var items = from doc in document.Descendants(todaysYear)
          let month = (string)doc.Element(todaysMonth)
          // Här uppstår ju <t>-elementet.
          where doc.Element("d").Value == todaysDay
          select doc;

    foreach (XElement element in items) {
      Response.Write(element.ToString());
    }

Have a nice weekend!

martine 2009-02-27 17:03

Citat:

Originally posted by peterbf@Feb 27 2009, 15:14
Jag har inte kommit långt själv. Jag har lyckats penetrera dokumentet och hamnat inne i rätt månad (<mx>). Men då kommer ju en massa <t>, det jag måste göra är att på nåt sätt iterera genom dessa för att hitta dagens datum inne i <d>, och därefter, på nåt sätt, kolla hur många värden det finns; och lägga till värdet man postar i formuläret i rätt ordning.

Använd Xpath för att hitta fram. Behöver du vet hur många element som finns så använder du Xpath även för detta.

Lägg till med insertBefore() eller appendChild().

(Sök på DOM och Xpath.)

Robert 2009-03-03 09:37

peterbf; du har helt rätt, det är knas i tänket runt xmlstrukturen. Döpa taggarna efter det värde de har (årtal)? Hmmm.... :D

martine 2009-03-03 10:42

Citat:

Originally posted by Robert@Mar 3 2009, 10:37
peterbf; du har helt rätt, det är knas i tänket runt xmlstrukturen. Döpa taggarna efter det värde de har (årtal)? Hmmm....

Jo, det är klart. Istället borde exempelvis attribut användas:
Kod:

<t year="2009" month="2">
Men att navigera i dokumentet går väl ändå bra med Xpath.


Alla tider är GMT +2. Klockan är nu 08:38.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson