Search code examples
phpxmlnodes

PHP extract data from xml nodes with same name


I am trying to extract values from a review xml file with deep node structure. I need to extract data from the parent node "reviews->reviews" AND from the child node "rating" WHERE 'questionGroup' = "DEFAULT_OPINION". I tried several code variants, but can't find a solution to get both values after searching for quite a while.

This is a part of the xml file:

<reviews>
  <reviews>
    <reviewId>f46f317c-5009-4ec4-ac8d-2b173db2dde6</reviewId>
    <reviewAuthor>K.</reviewAuthor>
    <city>Haarlem </city>
    <rating>10</rating>
      <reviewContent>
        <reviewContent>
            <questionGroup>DEFAULT_OVERALL</questionGroup>
            <questionType>INT</questionType>
            <rating>10</rating>
            <order>0</order>
            <questionTranslation>Totaal score</questionTranslation>
        </reviewContent>
        <reviewContent>
            <questionGroup>DEFAULT_ONELINER</questionGroup>
            <questionType>TEXT</questionType>
            <rating>Perfecte service en mooie kwaliteit bord. </rating>
            <order>0</order>
            <questionTranslation>Beschrijf uw ervaring in een regel</questionTranslation>
        </reviewContent>
        <reviewContent>
            <questionGroup>DEFAULT_OPINION</questionGroup>
            <questionType>TEXT</questionType>
            <rating>
            De service is perfect. Tijdens het bestelproces werden mijn vragen beantwoord middels chat berichtjes via de website. Het bord werd netjes verpakt geleverd en is van mooie                 kwaliteit. Erg blij mee.
            </rating>
            <order>0</order>
            <questionTranslation>Beschrijf uw ervaring</questionTranslation>
        </reviewContent>
        <reviewContent>
            <questionGroup>DEFAULT_RECOMMEND</questionGroup>
            <questionType>BOOLEAN</questionType>
            <rating>true</rating>
            <order>0</order>
            <questionTranslation>Aanbevelen?</questionTranslation>
        </reviewContent>
  </reviews>
<reviews>

This is my current code:

<?php
$xml = simplexml_load_file("https://www.kiyoh.com/v1/review/feed.xml?hash=bhokkolsgogtaf9");
$reviewContents = $xml->xpath('//reviewContent[questionGroup="DEFAULT_OPINION"]/rating');

foreach ($xml->reviews->reviews as $review){
          echo '<div class="kiyoh-shop-snippets"  style="{$show_rating|escape:"htmlall":"UTF-8"}"><div class="rating-box"><div class="rating"  style="width:' . ($review->rating*10) . '%"></div></div></div>';
    echo 'Naam: '.$review->reviewAuthor.'<br>';
    echo 'Woonplaats: '.$review->city.'<br>';
    echo 'Review: '.$review->reviewContent->reviewContent->rating.'<br>';
}
?>

I also tried:

<?php
$xml = simplexml_load_file("https://www.kiyoh.com/v1/review/feed.xml?hash=bhokkolsgogtaf9");

  foreach($xml->xpath('//reviewContent') as $item) {

    $row = simplexml_load_string($item->asXML());
    $v = $row->xpath('//questionGroup[. ="DEFAULT_OPINION"]');
    if($v[0]){
        print $item->reviewAuthor.'<br>';
        print $item->city.'<br>';
        print $item->rating.'<br>';
    }

}
?>

In the first code I get the results with name and city and the rating from the first node. In the second code I get the review I would like to display as ratingvalue, but not the parentnode data. How do I get this review data together with the results of the first code?


Solution

  • You have to loop through your review content and add condition for getting review for particular question group type

    <?php
    $xml = simplexml_load_file("https://www.kiyoh.com/v1/review/feed.xml?hash=bhokkolsgogtaf9");
    foreach ($xml->reviews->reviews as $review) {
      echo '<div class="kiyoh-shop-snippets"  style="{$show_rating|escape:"htmlall":"UTF-8"}"><div class="rating-box"><div class="rating"  style="width:' . ($review->rating * 10) . '%"></div></div></div>';
      echo 'Naam: ' . $review->reviewAuthor . '<br>';
      echo 'Woonplaats: ' . $review->city . '<br>';
      foreach ($review->reviewContent->reviewContent as $content) {
        if ($content->questionGroup == 'DEFAULT_OPINION') {
          echo 'Review: ' . $content->rating . '<br>';
        }
      }
    }