/ Forside / Teknologi / Udvikling / PHP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
PHP
#NavnPoint
rfh 3959
natmaden 3372
poul_from 3310
funbreak 2700
stone47 2230
Jin2k 1960
Angband 1743
Bjerner 1249
refi 1185
10  Interkril.. 1146
Finde forekomster i en .xml-fil
Fra : Jonas Voss


Dato : 30-12-02 16:32

Jeg har en XML-fil som indeholder oversigt over et mp3-katalog. Den er
autogenereret af iTunes, mp3-playeren til mac. Til hvert nummer listet
i filen gives bl.a. disse informationer:

<key>Name</key>
<string>Track_name</string>
<key>Artist</key>
<string>Artist_name</string>
<key>Album</key>
<string>Album_name</string>

Er der flere numre fra samme plade, gentager linierne:

<key>Album</key>
<string>Album_name</string>

sig derfor mange gange.

Min plan var at lave et lille script der kan hive de unikke
pladetitler og deres tilhørende kunstner ud så kunne man få en liste
kun over de albums (og kunstnere) der var i kataloget. Det kunne man
så skrive til en ny fil, som enten kunne være HTML eller rå tekst, det
har jeg endnu ikke bestemt.

Jeg har ikke gjort noget forsøg endnu, og spørger derfor af rent
metodemæssige årsager om hvad der ville være den smarteste måde at
gøre det på.

Jeg går ud fra at der er noget med at åbne filen og vha. nogle regexp
finde frem til det sted der skal trækkes ud (album-navn + titel på
kunstner), og at der kue skal trækkes første forekomst af
kombinationen Album+kunstner ud.

Jeg lurer dog lidt på om det er den "rigtige" måde at gribe det an
på, og om der ikke er en smartere metode.

Nogle idéer?

--
| Jonas @ 55.75, 12.42 | <http://verture.net/> |

Disk cache (n): Pennies, nickels, dimes and quarters.

 
 
Thomas Lindgaard (30-12-2002)
Kommentar
Fra : Thomas Lindgaard


Dato : 30-12-02 17:55

Jonas Voss <voss@dev.null.dk> wrote in news:8g56e-2j7.ln1
@wintermute.verture.net:

> Jeg g†r ud fra at der er noget med at †bne filen og vha. nogle regexp
> finde frem til det sted der skal tr‘kkes ud (album-navn + titel p†
> kunstner), og at der kue skal tr‘kkes f›rste forekomst af
> kombinationen Album+kunstner ud.
>
> Jeg lurer dog lidt p† om det er den "rigtige" m†de at gribe det an
> p†, og om der ikke er en smartere metode.

Hmm... skal det være PHP? For ellers kunne den rigtige måde jo være at
bruge noget XSL, når du nu allerede står med noget XML i hånden (men det
ved jeg ikke lige hvordan skal se ud for at få sorteret numre ud på
albums eller om det overhovedet kan lade sig gøre ud fra dit datasæt -
det virker som om det er noget lidt klumpet XML der bliver genereret).

Ellers kunne noget PHP a la

<?php

   $xml = "<key>Name</key>
<string>Track_name</string>
<key>Artist</key>
<string>Artist_name</string>
<key>Album</key>
<string>Album_name 1</string>
<key>Album</key>
<key>Name</key>
<string>Track_name</string>
<key>Artist</key>
<string>Artist_name</string>
<key>Album</key>
<string>Album_name 1</string>
<key>Album</key>
<key>Name</key>
<string>Track_name</string>
<key>Artist</key>
<string>Artist_name</string>
<key>Album</key>
<string>Album_name 2</string>
<key>Album</key>";

   $pattern = "/<key>(.*)<\/key>[\n\r]*<string>(.*)<\/string>[\n\r]
*/U";
   preg_match_all($pattern, $xml, $matches);
   print '<pre>';

   // What did the reg.exp. find?
   print_r($matches);
   
   // Sort the stuff
   $album_array = array();
   for ($i = 0; $i < count($matches[1]); $i += 3)
   {
      // Find the album, artist and track
      $album = $matches[2][$i + 2];
      $artist = $matches[2][$i + 1];
      $track = $matches[2][$i];
      
      // Add the track to the album_array
      $album_array[$album][] = array('artist' => $artist,
        'track' => $track);
   }
   
   // Print the sorted stuff
   print_r($album_array);
   
   print '</pre>';

?>

være en start.

Resultatet matcher ikke direkte en kunstner til et album men derimod
albums til (artist, track)-par (for ellers får man vel et problem med
cd'er med blandede numre).

.... og så er det skrevet på 10 minutter med hovedet under armen, så det
er langt fra sikkert at det er smart lavet og sårn - men koden virker :)

Mvh.
/Thomas

PS. Nu er det ikke fordi jeg vil påberåbe mig den store XML-ekspertise,
men jeg synes at kunne se fordele ved et XML-layout i stil med det
følgende i stedet for det der key-string-noget:

<albums>
   <album name="Ole Erlings Hammond-jul">
       <artist>Ole Erling</artist>
       <tracks>
           <track number="1" title="I Østen stiger solen op" />
           <track number="2" title="I Vesten går den ned" />
           ...
       </tracks>
   </album>
   <album name="Blandet musik 42">
       <artist>En masse forskellige</artist>
       <tracks>
           <track number="1" title="Den knaldrøde gummibåd"
           artist="Birthe Kjær" />
       </tracks>
   </album>
   ...
</albums>

Jonas Voss (30-12-2002)
Kommentar
Fra : Jonas Voss


Dato : 30-12-02 19:30

In dk.edb.internet.webdesign.serverside.php, Thomas Lindgaard wrote:

> Hmm... skal det være PHP? For ellers kunne den rigtige måde jo være at
> bruge noget XSL, når du nu allerede står med noget XML i hånden (men det
> ved jeg ikke lige hvordan skal se ud for at få sorteret numre ud på
> albums eller om det overhovedet kan lade sig gøre ud fra dit datasæt -
> det virker som om det er noget lidt klumpet XML der bliver genereret).

Ja, det er ikke særlig intelligent XML der bliver genereret, det vil
jeg give dig ret i. Hvert mp3-nummer har et id, og til dette id
knytter der sig informationer om album, titel, kunstner, tid mm.
På sin vis meget smart når det er mp3'ere man tagger, og ikke plader
som sådan, men altså lidt uhandy generet i deres XML.

> Ellers kunne noget PHP a la

[snip - kode]

> være en start.

Det ser da lovende ud i hvert fald, og skal helt klart prøves,
superfedt du lige fik skruet det sammen så hurtigt. Mange tak.

> Resultatet matcher ikke direkte en kunstner til et album men derimod
> albums til (artist, track)-par (for ellers får man vel et problem med
> cd'er med blandede numre).

Ja, godt observeret. Det havde jeg ikke overvejet.

> ... og så er det skrevet på 10 minutter med hovedet under armen, så det
> er langt fra sikkert at det er smart lavet og sårn - men koden virker :)

Og så kan jeg jo fedte videre med det, når jeg gennemskuer præcist
hvad den gør. Du skal i hvert fald have tusind tak for
forslaget/hjælpen.

> PS. Nu er det ikke fordi jeg vil påberåbe mig den store XML-ekspertise,
> men jeg synes at kunne se fordele ved et XML-layout i stil med det
> følgende i stedet for det der key-string-noget:
>
><albums>
>    <album name="Ole Erlings Hammond-jul">
>        <artist>Ole Erling</artist>
>        <tracks>
>            <track number="1" title="I Østen stiger solen op" />
>            <track number="2" title="I Vesten går den ned" />
>            ...
>        </tracks>
>    </album>
>    <album name="Blandet musik 42">
>        <artist>En masse forskellige</artist>
>        <tracks>
>            <track number="1" title="Den knaldrøde gummibåd"
>            artist="Birthe Kjær" />
>        </tracks>
>    </album>
>    ...
></albums>

Helt enig. I denne situation ved jeg ikke om det er dovenskab fra
Apples side der gør, at det er sådan et vagt DTD (hedder det det, i
XML?), eller om det er fordi de blot har brugt det deres programmer
bruger som schema for indstillingsfiler (plist-format, hvis opbygning
kan beskues her http://www.apple.com/DTDs/PropertyList-1.0.dtd). De bruger
nemlig <key><string>-tingen.

Men igen, mange tak for hjælpen, der er noget jeg kan lege med i hvert
fald.

--
| Jonas @ 55.75, 12.42 | <http://verture.net/> |

   My theory of evolution is that Darwin was adopted.
-- Steven Wright

Søg
Reklame
Statistik
Spørgsmål : 177519
Tips : 31968
Nyheder : 719565
Indlæg : 6408658
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste