'Dieper' niveau XML uitlezen
Code (php)
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
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´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´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>
- <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´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´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:
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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 />';
}
{
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! :)
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
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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 />';
}
{
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
Code (php)
1
2
3
4
5
6
7
8
9
10
11
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 />';
}
?>
$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é.
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>.
Gewijzigd op 01/01/1970 01:00:00 door Rogier
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
Oh ja, natuurlijk moet het == ipv = zijn. Dom van.
Bedankt voor jullie hulp en nog een fijne dag verder! :)
$sterren[0] ? 'Leeg' : $sterren[0];