PHP review ophalen via API

Status
Niet open voor verdere reacties.

damnsharp

Terugkerende gebruiker
Lid geworden
6 jan 2012
Berichten
1.385
Goedemorgen! Ik wil via PHP code bij een API aanroep URL een review ophalen en in een blok plaatsen op de site.
Dit is nieuw voor mij dus zou fijn zijn als ik wat op weg wordt geholpen ;-)
Ben natuurlijk wezen Googlen en heb al iets maar verre van compleet.

Stukje van de XML code van die url is:
Code:
<Kantoor xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/AdvieskeuzeAPI.Models">
<AantalReviews>134</AantalReviews>

<KNIP>

<Reviews>
<Review>
<Bron>xxxxxxxxxxxx</Bron>
<Datum>2018-10-09T19:07:32.753</Datum>
<Naam>Karel</Naam>
<Productgroep>Beroep</Productgroep>
<Toelichting>
Curabitur quam leo, varius a lorem sit amet, volutpat placerat nibh. Aliquam erat volutpat.
</Toelichting>
<Waardering>5</Waardering>
</Review>
<Review>
<Bron>xxxxxxxxxxxx</Bron>
<Datum>2018-09-22T21:38:55.933</Datum>
<Naam>Bob</Naam>
<Productgroep>Beroep</Productgroep>
<Toelichting>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque sollicitudin lacus eu ante accumsan, et vulputate dui tristique.
</Toelichting>
<Waardering>5</Waardering>
</Review>

Met onderstaande code kan ik de XML aanroepen maar wordt alles onder elkaar getoond, dat is niet de bedoeling. Hoe kan ik 1 review tonen? Liefst ook nog willekeurig.

Code:
<div class="col-md-3 col-xs-12 banner left">
    <h4 class="text">REVIEW</h4>
            <?php
            $reviews = file_get_contents('https://api.websitenaam.nl/locatie/details/apicode/xxxxxxx/xxxxx');
            echo $reviews;
            ?>
</div>

Thanks!
 
Ben al weer wat stapjes verder, met een test URL krijg ik info uit het XML bestand maar nog niet met de live URL want dan krijg ik foutmelding.

Gaat goed:
Code:
<?php
$url=file_get_contents('http://www.w3schools.com/php/note.xml');
$xml = new SimpleXMLElement($url);

echo $xml->Naam;

?>

Gaat fout:
Code:
<?php
$url=file_get_contents('https://api.websitenaam.nl/locatie/details/apicode/xxxxxxx/xxxxx');
$xml = new SimpleXMLElement($url);

echo $xml->review;

?>

Melding: Warning: SimpleXMLElement::__construct(): Entity: line 1: parser error : Start tag expected, '<' not found in
 
Volgens mij is de XML niet correct. Haal die eens door een XML-validator?
 
Volgens de documentatie van SimpleXMLElement zou je de url ook direct mee kunnen geven aan je constructor:

PHP:
<?php
$sxe = new SimpleXMLElement('http://example.org/document.xml', NULL, TRUE);

Heb je daar meer success mee?

Weet je zeker dat de URL een geldige XML teruggeeft?

Van welke dienst is dit de API? Wellicht kunnen we daar de documentatie van doornemen.
 
Bedankt @php4u en @thadevil voor reacties :thumb:

XML validator geeft error op 1e regel; This XML file does not appear to have any style information associated with it. The document tree is shown below.

Die aanpassing in de code @thadevil maakt geen verschil maar goed om te weten dat ik het ook zo kan schrijven.

Ik heb de xml aanbieder maar mail gestuurd (advieskeuze) en hoop dat ze snel reageren.


Dus even afwachten denk ik nu.


Oh hoe kan ik een loop maken om meerdere (in dit geval reviews) op te vragen?
 
Laatst bewerkt:
Dank je @php4u! Dat ziet er inderdaad goed uit. Ga er morgenvroeg mee aan de slag.

Las ergens dat ik het linkje moet parsen naar een Array; moet ik ook even uitzoeken maar dan zou het wel moeten werken om gegevens op te halen van de URL.
Wordt ook vervolgd :)
 
Met print_r kan je makkelijk zien wat je hebt gekregen. Simpele versie:
Code:
<pre><code>
<?php
$url = 'http://www.home.lan/abc/test/data.xml'; // xml lokaal gezet
$xml = file_get_contents($url);
if ($xml !== false) {
    $arr = explode("\n", $xml);
    print_r($arr);
}
?>
</code></pre>
 
Laatst bewerkt:
Als je geen permissie hebt om file_get_contents te gebruiken dan kan je curl proberen. Met een function() wordt het
Code:
function get_xml_from_url($url){
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    $ua = 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13';
    curl_setopt($ch, CURLOPT_USERAGENT, $ua);
    $xmlstr = curl_exec($ch);
    curl_close($ch);
    return $xmlstr;
}

$url = 'http://www.home.lan/abc/test/data.xml'; // xml lokaal gezet (bijlage)
$xmlstr = get_xml_from_url($url);
$xmlobj = new SimpleXMLElement($xmlstr);
// $xmlobj = (array)$xmlobj; // array ipv object
// print_r($xmlobj);
echo '<h3>', $xmlobj->AantalReviews, ' reviews gevonden</h3>';
foreach ($xmlobj->Reviews->Review as $value) {
    echo '<br>', $value->Naam, ' |', $value->Waardering, '| ', $value->Datum;
}

Resultaat print_r(object)

SimpleXMLElement Object
(
  [AantalReviews] => 3
  [Reviews] => SimpleXMLElement Object
    (
      [Review] => Array
        (
          [0] => SimpleXMLElement Object
            (
              [Bron] => xxxxxxxxxxxx
              [Datum] => 2018-10-09T19:07:32.753
              [Naam] => Karel
              ...
            )
          [1] => SimpleXMLElement Object
            (
              [Bron] => xxxxxxxxxxxx
              [Datum] => 2018-09-22T21:38:55.933
              [Naam] => Bob
              ...
            )
        )
    )
)
 

Bijlagen

  • data.xml.zip
    530 bytes · Weergaven: 29
Laatst bewerkt:
Thanks @bron voor meedenken! :)

Eerste code doet het perfect; ik krijg netjes alle XML gegevens onder elkaar, pfew.

De tweede code doet het niet, Parse error: syntax error, unexpected 'print_r' (T_STRING)
Maar ga stukje daarvan bij de eerste code proberen te plaatsen om gegevens eruit te halen.
 
Hè chips... het lukt me maar niet om een eenvoudig veld uit het XML bestand te laten tonen. Vind het te lastig.
Ik krijg wel info eruit op 2 verschillende manieren, zie VOORBEELD 1 en 3. Maar bij 2 gaat het niet goed. Snap ook niet precies hoe ik de velden in XML bestand kan aanroepen.

Graag hulp :)

Wil uiteindelijk een willekeurig review laten tonen maar nu zou 1tje al fijn zijn:
Code:
<Review>
<Bron>xxxxxxxxxx</Bron>
<Datum>2018-09-22T21:38:55.933</Datum>
<Naam>Bob</Naam>
<Productgroep>Beroep</Productgroep>
<Toelichting>
Helemaal van deze tijd. Perfect voor ons. De laagste prijs en toch alle service. 
</Toelichting>
<Waardering>5</Waardering>
</Review>
<Review>
<Bron>xxxxxxxxxx</Bron>
<Datum>2018-09-17T17:59:56.693</Datum>
<Naam>Bert</Naam>
<Productgroep>Beroep</Productgroep>
<Toelichting>
De begeleiding en het contact liep erg goed. Er werd snel gereageerd op mailtjes en de adviezen waren professioneel.
</Toelichting>
<Waardering>5</Waardering>
</Review>

PHP code
Code:
<?php
$url = 'https://api.websitenaam.nl/locatie/details/apicode/xxxxxxx/xxxxx'; // xml lokaal gezet
$xml = file_get_contents($url);
if ($xml !== false) {
    $arr = explode("\n", $xml);
    echo 'VOORBEELD 1</br>';
    print_r($arr);
}

echo '</br>VOORBEELD 2</br>';
$Kantoor = file_get_contents($url);
echo $Kantoor->Reviews[0]->Toelichting;

echo '</br>VOORBEELD 3</br>';
echo '</br>';
print_r($Kantoor);

?>

De output:
Code:
VOORBEELD 1
Array ( [0] => {"Naam":"xxxxxxxxxxx.nl xxxxxxxxxx Internetmakelaar","Slug":"xxxxxxxxxx","Score":9.8,"ID":"d3705873-361c-4871-b271-99a5892f08f7","AantalReviews":134,"LaatsteReview":"2018-10-09T19:07:32.753","ProfielCompleet":68,"IsAmbassadeur":true,"IsDataGecontroleerd"
<KNIP>


VOORBEELD 2

VOORBEELD 3

{"Naam":"xxxxxxxxxxxxxxx.nl xxxxxxxxxxxxxx Internetmakelaar","Slug":"xxxxxxxxxxxx","Score":9.8,"ID":"d3705873-361c-4871-b271-99a5892f08f7","AantalReviews":134,"LaatsteReview":"2018-10-09T19:07:32.753","ProfielCompleet":68,"IsAmbassadeur":true,"IsDataGecontroleerd"
 
Laatst bewerkt:
Ik zal een nieuwe vraag in XML gedeelte stellen en eenvoudiger beginnen; daarmee kom ik hopelijk verder.
 
Even terug bij #9. Je krijgt een errror bij print_r. Heb je dit staan? Dus mét (array)$xmlobj in de code?

Code:
$xmlobj = (array)$xmlobj;
print_r($xmlobj);

Bij mij werkt het.
 
Hoi @bron, ik had de code die je bij #9 hebt overgenomen en in php bestandje gezet maar dan krijg ik direct een error; dus iets doe ik niet goed denk ik.

Vond op stack overflow onderstaande code en aangepast met een test URL en die geeft in ieder geval XML data weer, behalve als ik die test URL verander door "mijn" URL dan weer leeg scherm.

PHP:
<?php
$url="http://helgesverre.com/blog/feed";
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_URL, $url);    // get the url contents

$data = curl_exec($ch); // execute curl request
curl_close($ch);

$xml = simplexml_load_string($data);
print_r($xml)

?>
 
Hè hè, met json query heb ik er iets uit gekregen, nog niet wat ik wil maar er is beweging in:

PHP:
<?php

$url = 'https://api.advieskeuze.nl/locatie/details/ff2463d1-354d-894b-87d1-882a8eb858e5/digimakelaars/d3705873-361c-4871-b271-99a5892f08f7?json=true'; // path to your JSON file
$data = file_get_contents($url); // put the contents of the file into a variable
$kantoor = json_decode($data); // decode the JSON feed

echo $kantoor->Naam;

?>

Alleen nu nog een review eruit halen en dan random een review ;)
 
Voor de duidelijkheid, van het volgende bestand krijg ik bijv Naam of Plaats eruit maar niet een Review:

Code:
<Kantoor xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/AdvieskeuzeAPI.Models">
<AantalReviews>135</AantalReviews>
<Naam>Testbedrijf</Plaats>
<Plaats>Oss</Plaats>
<Reviews>
	<Review>
		<Toelichting>
		blablabla
		</Toelichting>
	</Review>
	<Review>
		<Toelichting>
		nog meer blablabla
		</Toelichting>
	</Review>
</Reviews>

Als ik echo $kantoor->Reviews; doe krijg ik melding "Array".
 
Laatst bewerkt:
Dit werkt bij mij ook.

Code:
$url = 'http://www.example.nl/bla/bla/data.xml';
$content = file_get_contents($url);
$Reviews = simplexml_load_string($content);
if ($Reviews !== false) {
    // toon alle reviews met alle eigenschappen
    foreach ($Reviews->Review as $ReviewProp) {
        echo '<br>' . $ReviewProp->Naam;
        echo '<br>' . $ReviewProp->Datum;
        echo '<br>' . $ReviewProp->Toelichting;
        echo '<br>';
    }
}
// toon alleen van review 1 de naam en de toelichting. Reviews beginnen bij Review[0]
echo '<br>' . $Reviews->Review[1]->Naam;
echo '<br>' . $Reviews->Review[1]->Toelichting;

Kan je hiermee verder?

Noot: bij de xml van:
#11 mis ik bovenaan <Reviews> en onderaan </Reviews>
#16 een mismatch in <Naam>Testbedrijf</Plaats> en aan het eind mist </Kantoor>
 
Laatst bewerkt:
Nu aangepast aan al je laatste berichtjes

Gegevens
Code:
<Kantoor xmlns:i="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://schemas.datacontract.org/2004/07/AdvieskeuzeAPI.Models">
<AantalReviews>2</AantalReviews>
<Naam>Testbedrijf</Naam>
<Plaats>Oss</Plaats>
<Reviews>
<Review>
<Bron>xxxxxxxxxx</Bron>
<Datum>2018-09-22T21:38:55.933</Datum>
<Naam>Bob</Naam>
<Productgroep>Beroep</Productgroep>
<Toelichting>Helemaal van deze tijd. Perfect voor ons. De laagste prijs en toch alle service.</Toelichting>
<Waardering>5</Waardering>
</Review>
<Review>
<Bron>xxxxxxxxxx</Bron>
<Datum>2018-09-17T17:59:56.693</Datum>
<Naam>Bert</Naam>
<Productgroep>Beroep</Productgroep>
<Toelichting>De begeleiding en het contact liep erg goed. Er werd snel gereageerd op mailtjes en de adviezen waren professioneel.</Toelichting>
<Waardering>5</Waardering>
</Review>
</Reviews>
</Kantoor>

PHP
Code:
$url = 'http://www.home.lan/bla/bla/data.xml';  // url aanpassen
$content = file_get_contents($url);
$Kantoor = simplexml_load_string($content);
if ($Kantoor !== false) {

    // toon structuur van Kantoor
    echo '<pre>'; print_r($Kantoor); echo '</pre>';

    // Toon [AantalReviews]
    echo '<p>' . $Kantoor->AantalReviews . '</p>';

    // Toon een lijst met alle reviews
    foreach ($Kantoor->Reviews->Review as $ReviewItem) {
        echo '<p>';
        echo $ReviewItem->Naam . '<br>';
        echo $ReviewItem->Datum . '<br>';
        echo $ReviewItem->Toelichting . '<br>';
        echo '</p>';
    }

    // Toon de [naam] van 10 reviews (of minder als er minder reviews zijn)
    echo '<p>';
    for ($i = 0; $i < 10; $i++) {
        if ($i < $Kantoor->AantalReviews) {
            echo $Kantoor->Reviews->Review[$i]->Naam . '<br>';
        }
    }
    echo '</p>';

    // Toon Datum van Review[0] en Productgroep van Review[1]
    echo '<p>' . $Kantoor->Reviews->Review[0]->Datum . '</p>';
    echo '<p>' . $Kantoor->Reviews->Review[1]->Productgroep . '</p>';
}

Zo ziet de structuur eruit
Code:
SimpleXMLElement Object (dit is Kantoor)
(
  [AantalReviews] => 2
  [Naam] => Testbedrijf
  [Plaats] => Oss
  [Reviews] => SimpleXMLElement Object
  (
    [Review] => Array
    (
      [0] => SimpleXMLElement Object
      (
        [Bron] => xxxxxxxxxx
        [Datum] => 2018-09-22T21:38:55.933
        ....
 
Laatst bewerkt:
Hoi @bron,
Tof dat je ook zo meedenkt! Ik heb je laatste code geprobeerd maar ik krijg weer wit scherm.
Zie dat $Kantoor ook niets laat zien; heb wat code erboven gezet voor test.

PHP:
<?php
$url = 'https://api.advieskeuze.nl/locatie/details/ff2463d1-354d-894b-87d1-882a8eb858e5/digimakelaars/d3705873-361c-4871-b271-99a5892f08f7';  // url aanpassen
$content = file_get_contents($url);
$Kantoor = simplexml_load_string($content);

echo 'content inhoud';
echo '<pre>'; print_r($content); echo '</pre>';
echo '</br>';
echo 'kantoor inhoud';
echo '<pre>'; print_r($Kantoor); echo '</pre>';

if ($Kantoor !== false) {

Dus die echo voor de $content geeft wel wat weer, maar de echo $Kantoor niets...


Heb ook geprobeerd om een regel met juiste XML header toe te voegen maar dat maakt niet uit:

PHP:
<?php
$url = 'https://api.advieskeuze.nl/locatie/details/ff2463d1-354d-894b-87d1-882a8eb858e5/digimakelaars/d3705873-361c-4871-b271-99a5892f08f7';  // url aanpassen
$content = '<?xml version="1.0" standalone="yes"?>';
$content .= file_get_contents($url);
$Kantoor = simplexml_load_string($content);

echo 'content inhoud';
echo '<pre>'; print_r($content); echo '</pre>';
echo '</br>';
echo 'kantoor inhoud';
echo '<pre>'; print_r($Kantoor); echo '</pre>';

if ($Kantoor !== false) {

toevoeging: denk dat het met simplexml_load_string niet gaat lukken; met json kreeg ik er wel wat meer uit dus zal dat combineren met jouw code aanpassingen
 
Laatst bewerkt:
Wat ik nu denk, is dat de hele URL de verkeerde output geeft. Bijvoorbeled het veld "Naam" of "Woonplaats" zie ik er wel tussen staan en die kan ik met json ook oproepen.
Maar "Reviews" zie ik er niet tussen staan.
De URL met de JSON output

PHP:
<?php
 
$url = 'https://api.advieskeuze.nl/locatie/details/ff2463d1-354d-894b-87d1-882a8eb858e5/digimakelaars/d3705873-361c-4871-b271-99a5892f08f7?json=true'; // path to your JSON file
$data = file_get_contents($url); // put the contents of the file into a variable
$Kantoor = json_decode($data); // decode the JSON feed
 
echo '<p>' . $Kantoor->Naam . '</p>'; // dit geeft de naam weer

echo '<p>' . $Kantoor->Plaats . '</p>'; // dit geeft de plaats weer

echo '<p>' . $Kantoor->Reviews . '</p>'; // deze regel geeft de melding Array

// Toon [AantalReviews]
echo '<p>' . $Kantoor->AantalReviews . '</p>'; // dit geeft melding 135

echo '<p>' . $Kantoor->Medewerkers->Medewerker[1]->Achternaam . '</p>'; // geeft niets weer
?>
 
Status
Niet open voor verdere reacties.
Steun Ons

Nieuwste berichten

Terug
Bovenaan Onderaan