В этом уроке мы рассмотрим пример получения данных из XML файла с помощью модуля SimpleXML, который предоставляет очень простой и лёгкий в использовании набор инструментов для преобразования XML в объект, чтобы в последующем можно было работать через свойства этого объекта и с помощью итераторов (интерфейс, предоставляющий доступ к элементам массива или контейнера, и навигацию по ним).
Также мы рассмотрим примеры записи, полученных данных, в базу данных MySQL. И пример парсинга RSS ленты сайта (которая как правило имеет формат XML).
Содержание:
Парсинг RSS сайта на PHP
<?php
header("Content-Type: text/html; charset=utf-8");
$url = "ФАЙЛ XML"; //путь к XML файлу, или RSS ленте сайта
$rss = simplexml_load_file($url); //Интерпретирует XML-файл в объект
echo '<h1 style="text-align:center;">ВЫВОДИМ РЕЗУЛЬТАТ ПАРСИНГА</h1>'; //тут можно написать название сайта с которого мы получаем данные (или любую другую информацию)
//используем цикл foreach для обхода элементов в коллекции
foreach ($rss->channel->item as $items) {
//выводим результат парсинга
echo <<<HTML
<h2>{$items->элемент1}</h2>
<p>{$items->элемент2}</p>
<p>{$items->элемент2}</p>
<a href="/{$items->link}">Подробнее</a>
HTML;
}
?>
Пример парсинга XML в PHP
<?php
header("Content-Type: text/html; charset=utf-8");
$url = "rss.xml";
$rss = simplexml_load_file($url);
echo '<h1 style="text-align:center;">Парсинг файла RSS.XML</h1>';
foreach ($rss->channel->item as $items) {
echo <<<HTML
<h2>{$items->title}</h2>
<p>{$items->pubDate}</p>
<p>{$items->description}</p>
<a href="/{$items->link}">Подробнее</a>
HTML;
}
?>
PHP запись в базу данных
<?php
//подключаемся к БД (если не подключилис, то выводим ошибку, чтобы понять почему нет подключения)
$conn = new mysqli("хост", "логин", "пароль", "база_данных");
if($conn->connect_error){
die("Ошибка: " . $conn->connect_error);
}
//вставляем данные в БД
$sql = "INSERT INTO имя_таблицы (колонка1, колонка2, колонка3, колонка4) VALUES (значение_для_колонки1, значение_для_колонки2, значение_для_колонки3, значение_для_колонки4)";
//проверяем добавлена запись в БД, или нет (если не добавлена, то выводим ошибку, чтобы понять почему не получилось это сделать)
if($conn->query($sql)){
echo "Данные успешно добавлены";
} else{
echo "Ошибка: " . $conn->error;
}
$conn->close(); //закрываем ранее открытое соединение с базой данных
?>
Пример записи из XML в базу данных
<?php
$conn = new mysqli('localhost:3306', 'root', '', 'rss_db');
if($conn->connect_error){
die('Ошибка: ' . $conn->connect_error);
}
$url = 'rss.xml';
$rss = simplexml_load_file($url);
foreach ($rss->channel->item as $items) {
$a = $items->pubDate;
$b = $items->title;
$c = $items->description;
$d = $items->link;
$sql = "INSERT INTO qw8hv_rsstable (date, title, description, link) VALUES ('" . $a . "','" . $b . "','" . $c . "','" . $d . "')";
if($conn->query($sql)){
echo 'Запись ' . $b . ' успешно добавлена<br>';
} else {
echo 'Ошибка: ' . $conn->error;
}
}
$conn->close();
?>
Проверка на существование записи в базе данных
<?php
$conn = new mysqli("хост", "логин", "пароль", "база_данных");
if($conn->connect_error){
die("Ошибка: " . $conn->connect_error);
}
$sql = "SELECT title FROM имя_таблицы WHERE колонка='искомый_текст'";
$result = $conn->query($sql);
//Если совпадения есть, то выводим их в браузере
//Если совпадений нет, то выводим сообщение "Совпадений нет"
if ($result->num_rows > 0) {
echo "Есть совпадения:<br>";
while ($row = $result->fetch_assoc())
echo "Title: " . $row["title"] . "<br>";
} else {
echo "Совпадений нет";
}
?>
Пример проверки существования записи в БД
<?php
$conn = new mysqli("localhost:3306", "root", "", "rss_db");
if($conn->connect_error){
die("Ошибка: " . $conn->connect_error);
}
$sql = "SELECT title FROM qw8hv_rsstable WHERE title='Дмитрий!'";
$result = $conn->query($sql);
if ($result->num_rows > 0) {
echo "Есть совпадения:<br>";
while ($row = $result->fetch_assoc())
echo "Title: " . $row["title"] . "<br>";
} else {
echo "Совпадений нет";
}
?>
Замена символов в XML
В данном примере, мне понадобилось поменять элемент разметки, для того, чтобы выполнить полноценный парсинг ленты новостей сайта. Нужно было заменить <content:encoded> на <contentEncoded>.
$feeds = file_get_contents($feed_url); //ссылка на XML файл
$feeds = str_replace("<content:encoded>","<contentEncoded>",$feeds); //меняем <content:encoded> на <contentEncoded>
$feeds = str_replace("</content:encoded>","</contentEncoded>",$feeds); //меняем </content:encoded> на </contentEncoded>
$rss = simplexml_load_string($feeds); //интерпретирует строку в объект
Полный код парсинга RSS ленты сайта
<form method="POST">
<input type="submit" name="getRSS" value="Получить материалы по RSS" />
<input type="submit" name="addToDB" value="Получить материалы и записать в БД" />
</form>
<?php
# Если кнопка нажата
if(isset($_POST['getRSS']))
{
parseSite();
}
if(isset($_POST['addToDB']))
{
addToDB();
}
?>
<?php
function parseSite() {
header('Content-Type: text/html; charset=utf-8');
$url = "https://www.poe.pl.ua/feed/"; // Адрес RSS-ленты
//поиск и замена элемента в XML файле
$feeds = file_get_contents($url);
$feeds = str_replace("<content:encoded>","<contentEncoded>",$feeds);
$feeds = str_replace("</content:encoded>","</contentEncoded>",$feeds);
$rss = simplexml_load_string($feeds);
echo '<h1 style="text-align:center;">АТ "ПОЛТАВАОБЛЕНЕРГО"</h1>';
foreach ($rss->channel->item as $items) {
echo <<<HTML
<h2>{$items->title}</h2>
<p>{$items->pubDate}</p>
<p>{$items->description}</p>
<p>{$items->contentEncoded}</p>
<a href="/{$items->link}">Подробнее</a>
HTML;
}
}
function addToDB() {
$conn = new mysqli('localhost:3306', 'root', '', 'rss_db');
if($conn->connect_error){
die("Ошибка: " . $conn->connect_error);
}
$url = "https://www.poe.pl.ua/feed/"; // Адрес RSS-ленты
//поиск и замена элемента в XML файле
$feeds = file_get_contents($url);
$feeds = str_replace("<content:encoded>","<contentEncoded>",$feeds);
$feeds = str_replace("</content:encoded>","</contentEncoded>",$feeds);
$rss = simplexml_load_string($feeds);
foreach ($rss->channel->item as $items) {
$a = $items->pubDate;
$b = $items->title;
$c = $items->description;
$d = $items->link;
$e = $items->contentEncoded;
echo <<<HTML
<h2>{$items->title}</h2>
<p>{$items->pubDate}</p>
<p>{$items->description}</p>
<p>{$items->contentEncoded}</p>
HTML;
$testsql = "SELECT title FROM qw8hv_rsstable WHERE title='". $b ."'";
$result = $conn->query($testsql);
if ($result->num_rows > 0) {
echo "Такие записи уже есть в БД:<br>";
while ($row = $result->fetch_assoc())
echo "Title: " . $row["title"] . "<br>";
} else {
//Совпадений нет;
// Добавляем запись в БД
$sql = "INSERT INTO qw8hv_rsstable (date, title, description, link, fullnews) VALUES ('" . $a . "','" . $b . "','" . $c . "','" . $d . "','" . $e . "')";
if($conn->query($sql)){
echo "Данные успешно добавлены";
} else{
echo "Ошибка: " . $conn->error;
}
}
}
$conn->close();
}
?> 