Как использовать foreach() для итерации YQL XML и очистки HTML?

Не был уверен, как это назвать, поэтому я быстро уточню.

У меня есть скребок экрана, который я пытаюсь построить, используя консоль YQL. Запрос предоставляет пользователю выбор XML или JSON. Я ориентируюсь на аспект консоли YQL>data>html и выбрал XML в качестве выходного формата.

Мой YQL-запрос:

SELECT * FROM html WHERE url = "http://google.com"

Это обеспечит вам считывание дерева документов Google.com в формате XML. Слишком большой вывод для вставки в этот пост, поэтому просто нажмите на ссылку.

Моя проблема связана с обходом дерева XML с помощью PHP для правильного отображения результатов этого запроса. Я не знаю, как эффективно создать оператор foreach (или любой другой оператор) для эффективной очистки выходных данных XML, сбора дерева документов и его повторного отображения для собственных нужд.

Мой PHP:

$searchUrl = "google.com";

if(isset($_REQUEST['searchUrl'])) {
    $searchUrl = $_REQUEST['searchUrl'];
}

$query = "select * from html where url=\"http://".$searchUrl."\"";

$url = "http://query.yahooapis.com/v1/public/yql";

// Get Subcategory Article Data
$parameterData = "q=".urlencode($query);
$parameterData .= "&diagnostics=true";

// setup CURL 
$ch = curl_init($url); 
curl_setopt($ch, CURLOPT_HEADER, 0); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_POST, 1); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $parameterData); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
curl_setopt($ch, CURLOPT_TIMEOUT, 20);

// send
$response = trim(urldecode(curl_exec($ch)));

// parse response
$xmlObjects = @simplexml_load_string($response);

foreach ($xmlObjects->diagnostics as $diagnostics) {
    echo "<a href=".$diagnostics->url." target='_blank'>".$diagnostics->url."</a>";
}
foreach ($xmlObjects->results as $result) {
    // here is where I would go echo $result->body or something along those lines
}

Я полагаю, что на данный момент я немного озадачен из-за недостатка знаний о том, куда обращаться, чтобы перейти к дереву XML с таким форматом. После query>results>body в XML я не уверен, куда обратиться, чтобы собрать оставшиеся объекты и вывести его в мой документ в pre тег или что-то в этом роде.

Я хотел бы предоставить пользователям поле ввода для ввода своего собственного домена, и мой PHP отправит запрос, перебирает ответ и возвращает дерево документа пользователю для просмотра и отладки HTML.

Я знаком с PHP и XML в контексте итерации большого количества родительских элементов с такой же внутренней структурой, как RSS-канал или что-то в этом роде. В этом случае я имею дело с динамическим деревом XML, с одним большим объектом ответа и колеблющейся внутренней структурой.

1 ответ

Решение

Следующий код отобразит тело результата в виде HTML-страницы:

<?php

 // ... the code you posted in the question
 //     !without the diagnostics output!
 //     read comments of the answer to know why

?>
<html>
  <head>
  </head>
<?php
foreach ($xmlObjects->results as $result) {
    // asXml() will return the content of body as xml string
    echo $result->body->asXml();
    break;
}
?>
</html>

Обратите внимание, что, поскольку вы не получите <head> Элемент страницы через YQL вывод будет в большинстве случаев выглядеть беспорядочным.

Другие вопросы по тегам