КОнтакты, предложения, отзывы

.rar или .zip
Вложение
Онлайн-чат
На этом сайте, вы найдёте полезную информацию, практические советы в области веб-программирования, веб-дизайна и веб-разработок в целом. Мы с удовольствием поделимся с вами реальными примерами и решениями задач, связанных с jQuery , JavaScript , PHP и MySQL , версткой сайтов , поможем разобраться новичкам с современными технологиями, такими как Ajax , HTML5 , CSS3 и многими другими.

PHP и XML документы

SAX (Simple API for XML)

Описывает метод парсинга XML документов для получения данных из них
Создавать и изменять документы с помощью SAX невозможно
Основан на событиях, только для чтения строки XML, реагирует на события: найден открывающий тэг, найден закрывающий тэг, найден текст
XML-парсеру предоставляется набор собственных функций для обработки различных типов XML-данных
Парсер автоматически вызывает эти функции в процессе последовательной обработки документа

Как распарсить xml файл с помощью SAX

/* имеем для примера такой вот XML файл
   нужно вывести данные из него в виде таблицы */
<?xml version="1.0" encoding="utf-8"?>
<students>
  <student id="1">
    <name>Den</name>
    <age>19</age>
    <year>2001</year>
    <profession>Programmer</profession>
  </student>
  <student id="2">
    <name>sash</name>
    <age>14</age>
    <year>1983</year>
    <profession>Погромист</profession>
  </student>
</students>
 
Делаем следующее :
// определяем, что будет происходить, когда парсер найдёт открывающий тэг::
function onStart($parser, $tag, $attributes){
/* 1 параметр - ссылка на самого себя
   2 параметр - тэг, $tag будет в верхнем регистре 
   3 параметр - массив атрибутов */
  if($tag == 'STUDENT'){
    echo '<tr>';
  }
  if($tag != 'STUDENTS' and  $tag != "STUDENT"){
    echo '<td>';
  }
}
// функция на закрывающий тэг::
function onEnd($parser, $tag){
  if($tag == 'STUDENT'){
    echo '</tr>';
  }
  if($tag != 'STUDENTS' and  $tag != "STUDENT"){
    echo '</td>';
  }
}
// не нахождение текста
function onText ($parser, $text){
  echo $text;
}
 
// запуск парсера 
$parser= xml_parser_create('UTF-8');
// регистрация функций:
xml_set_element_handler($parser, 'onStart', 'onEnd');
xml_set_character_data_handler($parser, 'onText');

// вот и распарсили 
echo  '<table  width="100%" border="2" style="text-align:center">
  <tr><th>Имя</th><th>Возраст</th><th>Год рождения</th>
  <th>Профессия</th></tr>';
 xml_parse($parser, file_get_contents('example.xml'));
echo  '</table>';

DOM (Document Object Model)

// всё начинается с создания обьекта DOM:
$dom = new DomDocument();
$dom = new DomDocument('1.0', 'UTF-8'); // только для нового документа при создании
$dom->load('example.xml'); // читаем xml файл
$dom->loadXML($str); // XML строку
$dom->loadHTMLFile($filename); // HTML файл
$dom->loadHTML($str); // HTML строку
$root = $dom->documentElement; // получаем корневой элемент 
echo $root->nodeType;  // получим тип элемента
$children = $root->childNodes; // получаем детей корневого элемента
echo $root->textContent; // получим весь текст документа

//создание новых элементов
$titleDom = $dom->createElement('title');
$bookDom = $dom->createElement('book');
$titleText  = $dom->createTextNode('PHP5'); // создание текстового узла
//  Вариант создания нового элемента с текстом 
$titleDom = $dom->createElement('title', 'PHP 5');
// влагаем элементы друг в друга::
$titleDom->appendChild($titleText);
$bookDom->appendChild($titleDom);
$root->appendChild($bookDom);
// Сохранение в файл
$dom->save('newcatalog.xml');

Парсим файл из предыдущего примера

echo  '<table  width="100%" border="2" style="text-align:center">
<tr><th>Имя</th><th>Возраст</th><th>Год рождения</th>
<th>Профессия</th></tr>';
foreach($children as $student){
  if($student->nodeType == 1){
    echo '<tr>';
    foreach ($student->childNodes as $item){
      if($item->nodeType == 1){
      echo '<td>';
      echo $item->textContent;
      echo '</td>';
      }
    }
    echo '</tr>';
  }
}
echo '</table>';

Создание гостевой книги ( создаём и пишем в XML)

Для начала создадим HTML формочку в файле index.php:: Теперь - файл-обработчик: xml.php ( или можно в том же файле написать )
error_reporting(E_ALL);
define('USERS_LOG', 'users.xml'); // константа имя файла XMLя
if($_POST['submit']){ // имя кнопки отправки данных
  $name = $_POST['name'];
  $email = $_POST['email'];
  $msg = $_POST['msg'];
  $ip = $_SERVER['REMOTE_ADDR'];
  $dt = time();
  $dom = new DOMDocument('1.0', 'utf-8');
  // чтоб красиво всёс переносами строк записало, а не в одну:
  $dom->formatOutput = true; 
  $dom->preserveWhiteSpace = false;
  
  if(!file_exists(USERS_LOG)){
    $root = $dom->createElement('users');
    $dom->appendChild($root);
  }else{
    $dom->load(USERS_LOG);
    $root = $dom->documentElement;
  }
  
  // создаём xml элементы и наполняем их пришедшими данными:
  $n = $dom->createElement('name', $name);
  $e = $dom->createElement('email', $email);
  $m = $dom->createElement('message', $msg);
  $i = $dom->createElement('ip', $ip);
  $d = $dom->createElement('datetime', $dt);
  $user= $dom->createElement('user');
  
  // привязываем елементы::
  $user->appendChild($n);
  $user->appendChild($e);
  $user->appendChild($m);
  $user->appendChild($i);
  $user->appendChild($d);
  $root->appendChild($user);
  
  // сохраняем 
  $dom->save(USERS_LOG);
  header('Location: '. $_SERVER['HTTP_REFERER']); exit;
}

SIMPLEXML - the best of

// читаем xml файл в обьект::
$xml = simplexml_load_file('example.xml');
// считаем количество обьектов в корне файла (дочерних тэгов):
echo count($xml) . '<br>'; 
// вывод имени первого студента
echo $xml->student[0]->name . '<br>';
// в цикле
foreach($xml as $student){
  echo 'имя: '.$student->name. '<br>';
  echo 'возраст: '. $student->age. '<br>';
}

/* атрибутъ
  получим все атрибуты (массивом) *.
$attrs = $xml->student[0]->attributes();
var_dump($attrs);
// обращение к атрибуту id второго студента:
echo 'студент: ' . $xml->student[1]['id'];
// изменяем xml файл:
$xml->student[1]->profession="Decoder";
// изменит весь возраст (каждого студента)
foreach($xml as $student){
  $student->age="22";
}
// пишем в xml файл:
file_put_contents('example.xml', $xml->asXML());


// ПАРСИНГ:
echo  '<table  width="100%" border="2" style="text-align:center">
<tr><th>Имя</th><th>Возраст</th><th>Год рождения</th>
<th>Профессия</th></tr>';
foreach($xml->student as $item){
  echo '<tr>';
  echo '<td>' . $item->name . '</td>';
  echo '<td>' . $item->age . '</td>';
  echo '<td>' . $item->year . '</td>';
  echo '<td>' . $item->profession . '</td>';
  echo '</tr>';
}
echo '</table>';

Навороты xPath

Просто мощнейший инструмент. Позволяет делать выборки из xml документов точнее чем SQL.
Простейшие примеры:
// читаем xml файл в$xml
$xmlfile = __DIR__. "/example.xml";
$xml = new SimpleXMLElement($xmlfile, null, true);

$student = $xml->xpath("/students/student"); // абсолютный путь
$student = $xml->xpath("//student"); // относительный
$student = $xml->xpath("//student[@id]"); // с указанием атрибута
$student = $xml->xpath("//student[@id=2]"); // с точным значением атрибута
$student = $xml->xpath("//student[name/text() = 'sash']"); // с текстом = sash
$student = $xml->xpath("//student[name/text() = 'sash' or @id=1]");
$student = $xml->xpath("//student[name/text() = 'sash' and @id=1]");
$student = $xml->xpath("//student[name/text() = 'sash' or @id=1]/age/text()");
$student = $xml->xpath("//student/*"); // выведет всех потомков 
$student = $xml->xpath("//student[count(*)=2]");

print_r($student);

Рекомендация специалиста:: читаем SimpleXMLем, пишем DOMом

2015.08.01 63

Основные законы быдлокодинга Ты быдлокодер, если не считаешь себя быдлокодером. Нельзя перестать быть быдлокодером. Быдлокод языконезависим. Быдлокодер — тот, кто не стремится к идеальному коду. Быдлокодер — тот, кто стремится к идеальному коду. Любой кодер является и быдлокодером и не-быдлокодером одновременно (принцип быдлокота быдлокода Шредингера). Сам человек не может определить, быдлокодер он или нет. Это могут сделать только другие люди.
Войдите или Зарегистрируйтесь чтобы оставить комментарий

Комментарии


    Яндекс.Метрика Яндекс.Метрика