Ошибка загрузки данных XML с использованием нескольких запросов в PHP - PullRequest
0 голосов
/ 14 марта 2020

У меня есть следующий XML файл

<response>
<query>hello</query>
<zone name="url">
    <records s="*" n="0" total="0"/>
</zone>
<zone name="people">
    <records s="*" n="20" total="58" next="/result?q=hello&zone=people&s=AoIIRib9grewqTU2MGRkMS02YzgzLTQxYQ%3D" nextStart="AoIIRib9GD8NaWRlbnRpddfsdfk0OWQ=">
        <people id="1140172" url="/people/1140172">
        </people>
        <people id="1482231" url="/people/1482231">
        </people>
        <people id="832153" url="/people/832153">
        </people>
    </records>
</zone>
<zone name="collection">
    <records s="*" n="20" total="496" next="/result?q=hello&zone=collection&s=AoIIQsdfszdTIyNzc3MDUzNg%3D%3D" nextStart="AoIIQ3sHAysdfdszc3MDUzNg==">
        <work id="208227193" url="/work/208227193">
        </work>
        <work id="225096966" url="/work/225096966">
        </work>
        <work id="225096968" url="/work/225096968">
        </work>
    </records>
</zone>
<zone name="gazette">
    <records s="*" n="20" total="91239" next="/result?q=hello&zone=gazette&s=AoIIRdAyNjk3NzQ%3D" nextStart="AoIIgdfgek3NzQ=">
        <article id="249121748" url="/newspaper/249121748">
        </article>
        <article id="225072553" url="/newspaper/225072553">
        </article>
        <article id="249121741" url="/newspaper/249121741">
        </article>
    </records>
</zone>
<zone name="book">
    <records s="*" n="20" total="9245" next="/result?q=hello&zone=book&s=AogxMjk1Mg%3D%3D" nextStart="AoIIQ6HewytzdTIjk1Mg==">
        <work id="19554432" url="/work/19554432">
        </work>
        <work id="31597077" url="/work/31597077">
        </work>
        <work id="11135964" url="/work/11135964">
        </work>
    </records>
  </zone>
</response>

Я пытаюсь выполнить несколько запросов на одной странице, используя одни и те же данные, но у него есть несколько глюков. Некоторые «зоны» загружаются, а некоторые нет. Вот PHP, который я использую для загрузки данных;

    if ($_SERVER["REQUEST_METHOD"] == "GET") { 
     $last_name= $_GET["lastname"];
     $first_name= $_GET["firstname"];
     $result = simplexml_load_string(file_get_contents('https://api.url/v2/result?key=e4oheeek7rrr&zone=all&q='.$first_name.'%20'.$last_name));

        $books = $result->zone[5]->records->work;
        $newspaper = $result->zone[8]->records->article;
        $collection = $result->zone[3]->records->work;
        $gazette = $result->zone[4]->records->article;
    }

Затем в разделах я использую следующее для отображения результата, но он не загружает все зоны одновременно. Если я запускаю запросы отдельно, они работают просто отлично. Ниже приведены 2 примера очереди:

   // Display XML Results for Book Zone
 $id = 0;
     foreach ($books as $book) {
echo ' <div class="col-xs-12 col-sm-12 col-md-3 col-lg-3 col-xl-3 flex-container">';
     foreach ($book->title as $titles) {
        echo "<div class='book'>";
        echo "<span class='titles'>".$titles."</span><br>";
     }

     foreach ($book->snippet as $about){
        echo "<p>Snippet : ".$about."</p>";
     }

     foreach ($book->type as $type){
        echo "<p>Type: ".$type."</p>";
     }

     foreach ($book->identifier as $links){
        echo "<p>Websites: <a href='".$links."' target='_blank' title='Opens in new window' data-toggle='tooltip'>".$links."</a></p>";
     }

     foreach ($book->contributor as $contributor){
        echo "<p>Contributor : ".$contributor."<p>";
     }

     foreach ($book->issued as $issued){
        echo "<p>Issued : ".$issued."</p>";
     }

if ($id==7){
    echo "<p>Please register to view more results</p>";
    break;
     }
$id= $id+1;

         echo '</div></div>';
   }

Это второй запрос. Если я пытаюсь отобразить данные из 4 «зон», иногда загружается 1 или 2, и это могут быть разные «зоны», которые загружаются каждый раз.

// load data for Newspaper Zone
$z = 0;    
    foreach ($newspaper as $paper) {

    foreach ($paper->title as $papername) {
        echo "<span class='titles'>Newspaper: ".$papername."</span><br>";
     }
    foreach ($paper->heading as $heading) {
        echo "<span class='headings'> Headings: ".$heading."</span>";
     }
    foreach ($paper->snippet as $snippets){
        echo "<span class='snippet'>Snippet: ".$snippets."</span>";
     }
    foreach ($paper->troveurl as $web){
        echo "<b>Websites: </b><a href='".$web."'>".$web."</a><br>";
     }
    foreach ($paper->edition as $edition){
        echo "<b>Edition </b>: ".$edition."<br>";
     }
$z= $z+1;
if ($z==5){
    echo "Please register to view more results";
    break;
     }
   }

Спасибо.

1 Ответ

0 голосов
/ 15 марта 2020

Используйте Xpath для извлечения зон по их атрибутам имени вместо их положения.

$response = new SimpleXMLElement($xmlString);
$books = $response->xpath('//zone[@name="books"]/records/*');
foreach ($books as $book) {
  // ...
} 
...