'Dieper' niveau XML uitlezen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rogier

Rogier

06/06/2009 12:01:00
Quote Anchor link
Ik heb het volgende stukje XML:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
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
44
45
46
47
48
49
50
51
52
53
54
55
56
<products>
- <product>
  <productID>63955ad0a9801f8be5bcbfabf3f8ac2016b7dd61</productID>
  <name>Best Western New York</name>
  <price currency="EUR">366.00</price>
  <productURL>http://www.bex.nl/asp/tradetracker/....</productURL>
  <imageURL>http://217.114.103.234/webbeelden/Grote%20web%20beelden/700000/38000/738469-internet2.jpg</imageURL>
- <description>
- <![CDATA[ centraal gelegen hotel op ca. 5 min. loopafstand van het station en op ca. 10 min. loopafstand van de Promenade des Anglais.
  ]]>
  </description>
  <categories />
- <additional>
  <field name="geldig van">06/06/09</field>
  <field name="geldig tot">31/10/09</field>
  <field name="luchtvaartmaatschappij">KL|KLM</field>
  <field name="verzorging">|LO|Logies ontbijt</field>
  <field name="vervoer">Vliegtuig</field>
  <field name="vertrek_luchthaven">AMSTERDAM</field>
  <field name="werelddeel">Europa</field>
  <field name="land">FRANKRIJK</field>
  <field name="streek">,Alpes-Maritimes,C&#180;te d'Azur,Cote d'Azur</field>
  <field name="plaats">Nice</field>
  <field name="sterren">2</field>
  <field name="accommodatie">Hotel</field>
  <field name="seizoen">Z</field>
  </additional>
  </product>
- <product>
  <productID>ae824cbf5e53cda4eeeb8fc0b23a8f83dfb400e8</productID>
  <name>Nautica</name>
  <price currency="EUR">408.00</price>
  <productURL>http://www.bex.nl/asp/tradetracker/....</productURL>
  <imageURL>http://217.114.103.234/webbeelden/Grote%20web%20beelden/1000000/21000/1021740-internet2.jpg</imageURL>
- <description>
- <![CDATA[ prima hotel, goed gelegen vlakbij Vieux Nice. In het hotel vindt u allerlei nautische kenmerken terug!
  ]]>
  </description>
  <categories />
- <additional>
  <field name="geldig van">12/06/09</field>
  <field name="geldig tot">31/10/09</field>
  <field name="luchtvaartmaatschappij">KL|KLM</field>
  <field name="verzorging">|LO|Logies ontbijt</field>
  <field name="vervoer">Vliegtuig</field>
  <field name="vertrek_luchthaven">AMSTERDAM</field>
  <field name="werelddeel">Europa</field>
  <field name="land">FRANKRIJK</field>
  <field name="streek">,Alpes-Maritimes,C&#180;te d'Azur,Cote d'Azur</field>
  <field name="plaats">Nice</field>
  <field name="sterren">3</field>
  <field name="accommodatie">Hotel</field>
  <field name="seizoen">Z</field>
  </additional>
  </product>
<products>


Nu lees ik de naam uit met de volgende code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
foreach($xml->product as $product)
{
  echo $product->name. '<br />';
}


Dit gaat gewoon naar wens. Ik wil echter ook de waarde uit <field name="accommodatie"> en <field name="sterren"> tonen. Na veel gepruts heb ik dit wel voor elkaar gekregen, maar volgens mij doe ik het niet echt op de meeste efficiënte manier. Ik doe het als volgt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
foreach($xml->product as $product)
{
    foreach($product->additional as $additional)
    {
        foreach($additional->field as $field)
        {
            if ($field->attributes() == 'accommodatie')
            {
                $accommodatieType = $field;
            }
            if ($field->attributes() == 'sterren')
            {
                $sterren = $field;
            }
        }
    }
    echo 'De naam van de accommodatie: ' .$accommodatieType. ' ' .$product->name. '<br />';
    echo 'Het aantal sterren: ' .$sterren. '<br />';
        
}


Zou iemand mij misschien kunnen vertellen of dit de enige juiste manier is of dat het veel efficienter kan?

Alvast bedankt! :)
 
PHP hulp

PHP hulp

21/11/2024 23:24:31
 
Noppes

Noppes

06/06/2009 12:16:00
Quote Anchor link
en $xml is een object van DOM of SimpleXML ?

Ik vindt het knap ongelukkig gecodeerd...... de binnenste foreach loops zijn volgens mij helemaal niet nodig.

Zie o.a. - gebruikers posts:
http://www.php.net/simplexml-element-xpath
 
Rogier

Rogier

06/06/2009 12:20:00
Quote Anchor link
$xml is object van simpleXML ($xml = simplexml_load_file($feed);), mijn excuses voor de onvolledigheid.

Mij lijkt het dus ook niet dat al die foreach loops nodig zijn. Ik ben echter voor het eerste bezig met XML inlezen via PHP, dus heb geen idee hoe dit beter zou kunnen. Ik hoop daarom dat jullie mij kunnen helpen met een betere manier, die hopelijk ook nog eens makkelijk te snappen is. ;-)

Na nog wat testen heb ik in ieder geval 1 foreach weg kunnen halen. Nu is de code:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
foreach($xml->product as $product)
{
    foreach($product->additional->field as $field)
    {
        if ($field->attributes() == 'accommodatie')
        {
            $accommodatieType = $field;
        }
        if ($field->attributes() == 'sterren')
        {
            $sterren = $field;
        }
    }
    echo 'De naam van de accommodatie: ' .$accommodatieType. ' ' .$product->name. '<br />';
    echo 'Het aantal sterren: ' .$sterren. '<br />';
        
}
Gewijzigd op 01/01/1970 01:00:00 door Rogier
 

06/06/2009 12:46:00
Quote Anchor link
Volgens mij zou het zo moeten werken:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$xml
= simplexml_load_string($string);
foreach($xml->product as $product)
{

$sterren = $product->xpath('./additional/field[@name="sterren"]');
$accommodatieType = $product->xpath('./additional/field[@name="accommodatie"]');
    echo 'De naam van de accommodatie: ' .$accommodatieType[0]. ' ' .$product->name. '<br />';
    echo 'Het aantal sterren: ' .$sterren[0]. '<br />';
        
}

?>

Het kan waarschijnljik wel netter, maar dat weet ik niet zeker. Dat kan ook nog aan simplexml liggen.
Je xml klopt overigs niet, want die moet i.p.v. de onderste <products> dit hebben: </products>. Eind tag hé.
 
Rogier

Rogier

06/06/2009 13:09:00
Quote Anchor link
Het lijkt inderdaad te werken. Hartstikke bedankt daarvoor! :)

Nog twee vraagjes als je het niet erg vindt:
1. Ik gebruik liever gewoon $sterren in plaats van $sterren[0]. Enige oplossing hiervoor is om gewoon $sterren = $sterren[0]; te doen toch?

2. Als het aantal sterren leeg is wil ik een andere tekst weergeven. Iets als:
$sterren = $sterren[0] = '' ? 'Leeg' : $sterren[0];

of

$sterren = empty($sterren[0]) ? 'Leeg' : $sterren[0];

Deze codes werken alleen niet. Weet jij hoe ik dit moet doen? Als er geen sterren zijn dan ziet het veld er als volgt uit:
<field name="sterren"/> in plaats van bijvoorbeeld <field name="sterren">3</field>.
 
Rogier

Rogier

06/06/2009 13:10:00
Quote Anchor link
Dat de XML niet klopt kan ik niks aan doen. Deze krijg ik aangeleverd van een grote affliate partij.
Gewijzigd op 01/01/1970 01:00:00 door Rogier
 
Noppes

Noppes

06/06/2009 13:22:00
Quote Anchor link
Op die manier creeer je alleen maar overbodige variabelen.

En dan is het niet:
$sterren = $sterren[0] = '' ? 'Leeg' : $sterren[0];

maar:

$sterren[0] = $sterren[0] == '' ? 'Leeg' : $sterren[0];
Gewijzigd op 01/01/1970 01:00:00 door Noppes
 
Rogier

Rogier

06/06/2009 14:35:00
Quote Anchor link
Daar heb je wel gelijk in, maar ik vind het wel wat duidelijker daardoor. Nou ja, ik kijk nog wel even wat ik doe.

Oh ja, natuurlijk moet het == ipv = zijn. Dom van.

Bedankt voor jullie hulp en nog een fijne dag verder! :)
 

06/06/2009 14:45:00
Quote Anchor link
Volgens mij kan het zelfs ook nog zo:
$sterren[0] ? 'Leeg' : $sterren[0];
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.