Помогни ни да направим Uroci.net по - богат! Добави урок

Парсване на XML през PHP

PHP » PHP
Versus   трудност:    видян: 12054



<?php
/**
* Тази функция "обхожда" цялото дърво от директории
* Връща масив: 'nav' навигационната система и 'tree' карта на дървото
*/

function map_dirs($path, $level = 0)
{
$node = '';
$text = '';

global $text, $node, $tree;
$dir = $node;

if (is_dir($path))
{
if ($contents = opendir($path))
// "Отваряме" директорията
{
while (($node = readdir($contents)) !== false)
{
if ($node != "." && $node != ".." && strtolower($node) != "images")
//Exclude some DIRs from the list
{
if (is_dir($path . "/" . $node)) //Взима само директориите
{
while (@!chdir($node))
// Подсигуряваме се, че сме в директорията отговаряща на $node
chdir('..');

if ($level == 0)
// Добавяме някой красоти :) за да създадем просто меню
{
$img = '<img xsrc="images/star.gif" alt="">';
$node_txt = strtoupper($node);
}
else
{
$img = '<img xsrc="images/halfstar.gif" alt="">';
$node_txt = ucfirst($node);
}

for ($i = 0; $i < $level; $i++)
$text .= "   ";

$text .= "nt" . '<span class="category">' . $img . '<a xhref="index.php?dir=' .
base64_encode(getcwd()) . '&mode=show">' . $node_txt . '</a></span><br>';

$tree[] = getcwd();
}
map_dirs("$path/$node", $level + 1);
// За да обходим дървото изцяло имаме нужда от рекурсивна функция именно затова тази фунция вика сама себе си
}
}
}
}
$result['nav'] = $text;
$result['tree'] = $tree;

return $result;
}
/**
* Зарежда извлечения XML документ в таблица
* Връща стринг
*/

function show_deteils($deteils)
{
................
}
/**
* Въвежда книги в база данни
* Параметъра трябва да бъде масив с индекси 'BOOK0','BOOK1' и т.н....
* Echo успех или грешка
*/

function add_query($data)
{
global $db_colons;

$colons = $db_colons;
$output = '';
$id = '';

if (!is_array($data)) //Проверка
{
echo "<p><b>Невалиден ресурс! Параметъра трябва да бъде масив</b></p>";
return false;
}


for ($i = 0; $i < count($data); $i++)
{
//clear the query string
$add = '';
$add_array = '';

if (!check_array($data['BOOK' . $i]))
return false;

foreach ($data['BOOK' . $i] as $key => $value)
//Премахва всички елемнти, които не са нужни на БД
{
if (in_array(strtolower($key), $colons))
{
$add_array[] .= '`' . strtolower($key) . '` = "' . addslashes($value) . '"';
}
else
$warning = 1;
}

$num = count($add_array);
for ($y = 0; $y < $num; $y++) //Изгражда заявката за БД
{
$z = $y;
$z++;
if ($z < $num)
$add .= $add_array[$y] . ',';
else
$add .= $add_array[$y];
}

open_connection();//Отваряме връзка към БД и въвеждаме данните

$add_query = 'INSERT INTO `books` SET ' . $add;
$add_result = mysql_query($add_query) or die('There was an error: ' .
mysql_error());
$id .= mysql_insert_id() . ', ';//Изграждаме стринг с въведените ИД за информация

}
$num = count(explode(',', $id)) - 1;//Общия брой на всички въведени редове

if ($warning)
$output .= "nt" . 'Внимание: Имаше неразпознати елементи в XML файла<br>';

$output .= "nt" . 'Бяха въведени следните ID: ' . $id . ' общо ' . $num .
' rows.<br>';

return $output;
//$xml->show_xml();
}
/**
* Проверява дали XML файла има всички задължителни елемнти и че няма празни такива
* Параметър: масив
* Връща true при успех и false с предупреждение при неуспех
*/

function check_array($array)
{
global $oblig_obj;
$oblig_str = $oblig_obj;

if (!is_array($oblig_str))
return false;

foreach ($array as $key => $value)
{
$value = trim($value);
if (empty($array[$key])) //Проверка дали елемента е празен
{
echo "<p><b>Празен елемент '$key'. Проверете XML файла.</b></p>";
return false;
}
}

for ($i = 0; $i < count($oblig_str); $i++)
{
if (!array_key_exists($oblig_str[$i], $array))
//Проверява за съществуването на задължителните полета, които са указани в config.php
{
echo "<p><b>Грешка в XML файла: Парсърът откри липсващ елемент '$oblig_str[$i]'.</b></p>";
return false;
}
}
return true;
}
/**
* Отваря връзка към ДБ
*/

function open_connection()
{
................
}
/**
* Зарежда всички XMLфайлове, които са налични в дървото от директории
* Parameters: масива генериран от map_dirs() и името на файла
* Return: стринг със съдържанието на всички XMl файлове
*/

function load_all($nav, $filename)
{

for ($i = 0; $i < count($nav['tree']); $i++)
// събира всички XML файлове в един стринг
{
if (@!($string .= file_get_contents($nav['tree'][$i] . '/' . $filename)))
echo '<p>Внимание има директория без XML <b>' . $filename . '</b>!';
}
$tok = strtok($string, "nt");// Раздробява получения стринг по нови редове
while ($tok !== false)
{
$add[] = $tok;
$tok = strtok(" nt");
}
//Ще премахнем някой елемнти от стринга за да избегнем повторение
$replace = array('<?xml version="1.0" encoding="UTF-8"?>',
'<?xml version="2.0" encoding="UTF-8"?>', '<bookContainer>', '</bookContainer>');

for ($i = 0; $i < count($replace); $i++)
$string = str_ireplace($replace[$i], '', $string);

$string = $add[0] . $add[1] . $string . $add[count($add) - 1];//задаваме начало и край н ановополучения XML файл
return $string;
}
?>


Няма да се впускам в обяснение. Пълния вариант на файла ще намерите в архива към урока.

Ще разгледаме съдържанието на index.php, което само по себе си е пример за ползването на класа и библиотеката от функции. Тук отново няма да се впускам в подробности, проследете коментарите по скрипта

<?php
session_start();
//Марка за стартовото време
$time_start = microtime(true);
//Зареждаме нужните ни файлове
require_once ("inclu_fns.php");
require_once ("config.php");
require_once ("bpclass.php");

if (($_GET['dir']) || (($_GET['mode']) && ($_GET['mode']) == 'all'))
//Проверяваме за подадени параметри през GET
{
if ($_GET['dir'])
{
$code_dir = $_GET['dir'];
$dir = base64_decode($code_dir);
if (!eregi('^[A-Z0-9_/:-]+$', $dir))
//стринга може да съдържа само числа и букви и знаците _ - като всички позволени имена на директории
$dir = '';
if (!empty($dir))
define("SCRIPT", "ON");//Ако всичко е наред, задаваме началото на скрипта
}
elseif ($_GET['mode'] && $_GET['mode'] == 'all')
{
define("SCRIPT", "ON");//Ако всичко е наред, задаваме началото на скрипта
}
}
require_once ('topbar.php');

$nav = map_dirs($main_path, 0); //Обхождаме дървото от директории

if (defined("SCRIPT"))
//Ако сме дефинирали началото, основната част от скрипта започва
{
$filename = $xml_file;
$url = $dir . '/' . $filename;
$stack = array();
if ($_GET['mode'])
$mode = $_GET['mode'];
else
$mode = 'show';

switch ($mode) //разглеждаме различните варианти на $mode, който е различни в различните етапи на процеса
{
case 'show':
$xml = new BookParser;// Правим инстация на парсър класа
$xml->set_BP($mode, $url, null);// зареждаме нужните на класа променливи
$stack = $xml->parser();// зареждаме резултата от XML файла

$deteils = show_deteils($stack);
echo $deteils;
echo '<p><a xhref="index.php?dir=' . $code_dir .
'&mode=queryadd">Add this table in the DataBase.</a></p>';
break;
case 'queryadd':
if (isset($_SESSION['content']))
$content = $_SESSION['content'];
else
$content = '';
if ($dir == 'all')
$mode = 'all';

$xml = new BookParser;// Правим инстация на парсър класа
$xml->set_BP($mode, $url, $content);// зареждаме нужните на класа променливи
$stack = $xml->parser();// зареждаме резултата от XML файла

$query_res = '<h1>' . add_query($stack) . '</h1>';
echo $query_res;
break;
case 'all':
$content = load_all($nav, $filename);
// Зареждаме съдържанието на всички XMl файлове в дървото
$xml = new BookParser;// Правим инстация на парсър класа
$xml->set_BP($mode, $url, $content);//зареждаме нужните на класа променливи
$stack = $xml->parser();//зареждаме резултата от XML файла

$_SESSION['content'] = $content; // запазваме съдържанието на заредения XML файл, който съдържа всички файлове от всички директории за по-късна употреба

$deteils = show_deteils($stack);
// извикваме deteils() от библиотеката с функции
echo $deteils;
echo '<p><a xhref="index.php?dir=' . base64_encode('all') .
'&mode=queryadd">Add this table in the DataBase.</a></p>';
break;

}
}

echo "nt".'<h3><a xhref="index.php?mode=all">Show All</a></h3>';
echo $nav['nav'];

require_once ('bottom.php');
?>




  Работните файлове от урока.

Have Fun!
Versus


Страници: «1 2 3

Коментари (1)

ganbox на 13.08 2009 в 17:34ч.
Една статия за лесно парсване на RSS новини има в блога на ganbox.com статия PHP парсване на XML новини за твоя сайт http://ganbox.com/blog/php-парсване-на-xml-новини-за-твоя-сайт/

Регистрирайте се, за да добавите коментар


Калдейта ЕООД - © 2003-2010. Всички права запазени.
Препоръчваме: Национален Бизнес | Bomba.bg | IT Новини | Диплома.бг | TRAVEL туризъм | Реферати | AmAm.bg | Иде.ли | Курсови работи | Фото Форум | Spodeli.net | Фото-Култ | Atol.bg | Elmaz.com | MobileBulgaria.com | Казанлък.Com