[PHP] XML parsen, dubbele tags

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • t1mmy
  • Registratie: Mei 2006
  • Laatst online: 14-08 16:39
Voor een project ben ik bezig met het maken van een XML parser voor bepaalde bestanden. Deze bestanden worden aangeleverd door de SabNZBD+ server van een gebruiker.
Reeds heb ik een parser gemaakt voor de queue van zo'n server, nu ben ik bezig met een voor de history maar loop hierbij tegen wat problemen aan.

In de XML file wordt er gebruik gemaakt van <slots> en <slot>. Tussen de <slots> tags staan alle items van de geschiedenis en tussen de <slot> tags staan de individuele item's. Nu loopt dit fout omdat er meerdere keren gebruik wordt gemaakt van een <slot> tag binnen één item (en dus <slot>).
Als ik dus nu via een foreach elk slot ga parsen en HTML list tags ga gebruiken krijg ik hier problemen van.

Hier wat sample code:

Een stukje XML:
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?xml version="1.0" encoding="UTF-8" ?>
<history>
<slots>
<slot>
<action_line></action_line>
<show_details>True</show_details>
<script_log></script_log>
<meta>None</meta>
<fail_message></fail_message>
<loaded>False</loaded>
<id>10</id>
<size>1.12 KB</size>
<category>None</category>
<pp>D</pp>
<completeness>0</completeness>
<script></script>
<nzb_name>00-think_toy_-_dance_sessions-sat-02-26-2010-talion.nfo.nzb</nzb_name>
<download_time>5</download_time>
<storage>/Users/timwachter/downloads/complete/00-think_toy_-_dance_sessions-sat-02-26-2010-talion.nfo</storage>
<status>Completed</status>
<script_line></script_line>
<completed>1267375802</completed>
<nzo_id>SABnzbd_nzo_H5d6af</nzo_id>
<downloaded>1145</downloaded>
<report></report>
<path>/00-think_toy_-_dance_sessions-sat-02-26-2010-talion.nfo</path>
<postproc_time>0</postproc_time>
<name>00-think_toy_-_dance_sessions-sat-02-26-2010-talion.nfo</name>
<url></url>
<bytes>1145</bytes>
<url_info></url_info>
<stage_log><slot><name>Download</name>
<actions><item>Downloaded in 5 seconds at an average of 199B/s</item>
</actions>
</slot>
<slot><name>Repair</name>
<actions><item>[00-think_toy_-_dance_sessions-sat-02-26-2010-talion.nfo] No par2 sets</item>
</actions>
</slot>
</stage_log>
</slot>
</slots>
</history>


En de parser so far:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php

  $url = "sample.xml";
  $doc = new DOMDocument();
  $doc->load($url);
   
 $slot = $doc->getElementsByTagName("slot");

  foreach( $slot as $slot )
  {
    $title = $slot->getElementsByTagName( "name" )->item(0)->nodeValue;
    $size = $slot->getElementsByTagName( "size" )->item(0)->nodeValue;

    echo "<li class='textbox'>";
    echo "<span class='header'>".$title."</span>";  
    echo "<span class='comment'>".$size."</span>";
    echo "</li>";
    }  

?>


Uiteraard parse ik nog niet alle tags, want ik wil dit probleem eerst opgelost hebben..

Acties:
  • 0 Henk 'm!

Verwijderd

Gebruik xpath, scheelt je een hoop moeite bij dit soort constructies.

Acties:
  • 0 Henk 'm!

  • Caelorum
  • Registratie: April 2005
  • Laatst online: 20:37
PHP:
1
2
$slot = $doc->getElementsByTagName("slot"); 
foreach( $slot as $slot )

Is dat wel verstandig? heb je al geprobeerd twee verschilende variabele namen te gebruiken?

Acties:
  • 0 Henk 'm!

Verwijderd

Caelorum schreef op maandag 01 maart 2010 @ 08:27:
PHP:
1
2
$slot = $doc->getElementsByTagName("slot"); 
foreach( $slot as $slot )

Is dat wel verstandig? heb je al geprobeerd twee verschilende variabele namen te gebruiken?
Mee eens, overigens wil je misschien kijken naar de nieuw XML reader van PHP?
http://php.net/manual/en/book.xmlreader.php

Acties:
  • 0 Henk 'm!

  • steffex
  • Registratie: Augustus 2003
  • Laatst online: 12-08 00:24
Ik zou gewoon simplexml element gebruiken. Die maakt mooi een object van je xml en hoef je niet steeds getElementsByTagName te gebruiken.

Daarnaast is het, zoals hierboven al vermeld, niet heel erg verstandig om je foreach zo te gebruiken.

Ook moet je eens naar variabelen benaming kijken. Je haalt meerdere slots op, dus noem dan je var ook slots ipv slot. Als er andere mensen naar je code moeten kijken, is het voor hun ook een stukje duidelijker ;)

[ Voor 30% gewijzigd door steffex op 01-03-2010 10:52 ]


Acties:
  • 0 Henk 'm!

Verwijderd

stef-o schreef op maandag 01 maart 2010 @ 10:50:
Ik zou gewoon simplexml element gebruiken. Die maakt mooi een object van je xml en hoef je niet steeds getElementsByTagName te gebruiken.

Daarnaast is het, zoals hierboven al vermeld, niet heel erg verstandig om je foreach zo te gebruiken.

Ook moet je eens naar variabelen benaming kijken. Je haalt meerdere slots op, dus noem dan je var ook slots ipv slot. Als er andere mensen naar je code moeten kijken, is het voor hun ook een stukje duidelijker ;)
Ja verdorie, die bedoelde ik eigenlijk in mijn vorige post!
http://php.net/manual/en/book.simplexml.php

Thanks for the reminder! Had de verkeerde in gedachten even.

Acties:
  • 0 Henk 'm!

  • t1mmy
  • Registratie: Mei 2006
  • Laatst online: 14-08 16:39
Bedankt voor de informatie! Ik zal me gaan verdiepen in XML class als ik weer tijd heb.
Pagina: 1