В цьому уроці ми розглянемо приклад отримання даних з 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();
}
?> 