SimpleXML

Парсинг XML с помощью SimpleXML PHP

В этом уроке мы рассмотрим пример получения данных из 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();
}
?>

Main Menu