Вывести нужные поля из XML
Страницы: 1 2 След.
[ Закрыто ] Вывести нужные поля из XML
Всем привет! Мучает и не отпускает вопрос. Кто сталкивался или знает как решить данный вопрос, help me.
Задача. Есть xml-файл

Код
 <journals>
   <journal id="1">
      <title>Журнал 1</title>
      <contacts>
         <address>Адрес 1</address>
         <tel>1</tel>
      </contacts> 
   </journal>
   <journal id="2">
      <title>Журнал 2</title>
      <contacts>
         <address>Адрес 2</address>
         <tel>2</tel>
      </contacts> 
   </journal>
   <journal id="3">
      <title>Журнал 3</title>
      <contacts>
         <address>Адрес 3</address>
         <tel>3</tel>
      </contacts> 
   </journal>
</journals>
Необходимо вывести на экран нужные значения переменных, зная id journal

Например, зная id=1 и id=3;
Надо получить 
Журнал 1, Адрес 1, Телефон 1
Журнал 3, Адрес 3, Телефон 3

Знаю как вывести все сразу, через simplexml_load_file, но как вывести только выбранные значения не могу получить.
Можете через Regex порвать xml на части и выводить как душе угодно. Регулярка довольно простая будет, примеры все есть.
Можно так:
Код
preg_match_all("!<journal id=\"([0-9]+)\">[^<]*<title>(.*?)</title>[^<]*<contacts>[^<]*<address>(.*?)</address>[^<]*<tel>(.*?)</tel>[^<]*</contacts>[^<]*</journal>!si", $source, $out);
Изменено: Sillys - 28 Февраля 2013 20:30
Предлагаю Услуги по веб-разработке/программированию
HTML(HTML5), CSS(CSS3), JavaScript(jQuery, AJAX), PHP, MySQL
========================================
http://www.cy-pr.com/forum/f58/t37537/
http://www.cy-pr.com/forum/f50/t35619/
В $source загружаете содержимое файла, ниже через эту регулярку загружаем ваш Xml в массив, из него по id выбираем те что нужны smile:)
Изменено: Sillys - 28 Февраля 2013 20:36
Ну да, xml для того и сделали, чтобы регулярками ковырятся.... http://www.php.net/manual/ru/simplexml.examples-basic.php в помощь
Цитата
Dr.Death.3 пишет:
Ну да, xml для того и сделали, чтобы регулярками ковырятся.... http://www.php.net/manual/ru/simplexml.examples-basic.php в помощь
Я с вами полностью согласен, но он новичёк, так что лучше для начала простой пример с регулярками разобрать smile:)

P.S. В целом если задача не велика я бы воспользовался парой регулярок в целях экономии ресурсов! Подключение класса жирно будет для не большой единичной задачи)
Изменено: Sillys - 28 Февраля 2013 20:42
[COLOR=#0000bb]// интерпретирую xml в объект[/COLOR]
$source = simplexml_load_file('file.xml');
пишу регулярное выражение

[TABLE]

[TR][TD]
preg_match_all("!<journal id=\"([0-9]+)\">[^<]*<title>(.*?)</title>[^<]*<contacts>[^<]*<address>(.*?)</address>[^<]*<tel>(.*?)</tel>[^<]*</contacts>[^<]*</journal>!si", $source, $out);
[/TD][/TR]

[/TABLE]

проверяю $outvur_dump (out);
выводится такой массив

Код
 array(5) { [0]=> array(0) { } [1]=> array(0) { } [2]=> array(0) { } [3]=> array(0) { } [4]=> array(0) { } }
не понял куда поставлять id, чтобы вытащить нужные поля
Bubles,  Если использовать регулярные выражения, а не выше приведённый класс нужно делать так:

Код
$source = file_get_contents('file.xml');

preg_match_all("!<journal id=\"([0-9]+)\">[^<]*<title>(.*?)</title>[^<]*<contacts>[^<]*<address>(.*?)</address>[^<]*<tel>(.*?)</tel>[^<]*</contacts>[^<]*</journal>!si", $source, $out);

print_r($out);
В UTF-8 так:

Код
$source = file_get_contents('file.xml');

preg_match_all("!<journal id=\"([0-9]+)\">[^<]*<title>(.*?)</title>[^<]*<contacts>[^<]*<address>(.*?)</address>[^<]*<tel>(.*?)</tel>[^<]*</contacts>[^<]*</journal>!siu", $source, $out);

print_r($out);
Изменено: Sillys - 28 Февраля 2013 20:57
Структура у вас же другая в Xml файле, тогда так:

Код
$source = file_get_contents('data.xml');

preg_match_all("!<person id=\"([0-9]+)\">[^<]*<gender>(.*?)</gender>[^<]*<birthday>(.*?)</birthday>[^<]*<name>(.*?)</name>[^<]*<last_name>(.*?)</last_name>[^<]*<second_name>(.*?)</second_name>[^<]*<work>[^<]*<company>(.*?)</company>[^<]*<profession>(.*?)</profession>[^<]*</work>[^<]*</person>!si", $source, $out);

print_r($out);
Sillys, спасибо большое!  Теперь выводится, но с двумя косяками. Первый это кодировка, файл где выводится у меня всё в кодировке win-1251. Когда работал с классами, там прописывал

Код
$data->name = mb_convert_encoding($data->name, "windows-1251", "auto");
 
сейчас непонятно как перекодировать, и как всё таки выбрать нужный массив зная id
Дальше циклом перебирай массив, при совпадении выводи информацию smile:)
Так, разобрался с выводом, но получается вот что:
Беру $id и подставляю в $out[0][$id]
Код
 foreach ($name as $id)
   {
      // id - выбранный id person
      //echo "$id<br/>";
      
      echo '<pre>';
      print_r($out[0][$id]);
      echo '</pre>';
   }
Получаю:

Код
   F 29.06.1982 Алевтина РљРѕСЂРѕРІРёРЅР° Семеновна  РЎРѕРІС…РѕР· "Красные Р—РѕСЂРё" РґРѕСЏСЂРєР°

Как мне справится с кодировкой?

mb_convert_encoding($, "windows-1251", "auto"); — не помогает
и как вытащить отдельные данные(пол F, дату рождения) и занести в переменные?

Получается что это один целый массив.
Лучше думаю так:
Код
$i = 0;
while ($i < count($out[0])) {
   if ($out[0][$i] == $id) {
      echo '<pre>';
      echo $out[0][$i] . '<br />'; //ID
      echo $out[1][$i] . '<br />'; //Gender
      echo $out[2][$i] . '<br />'; //Birthday
      echo $out[3][$i] . '<br />'; //Name
      echo $out[4][$i] . '<br />'; //Last_name
      echo $out[5][$i] . '<br />'; //Second_name
      echo $out[6][$i] . '<br />'; //Company
      echo $out[7][$i] . '<br />'; //Profession
      echo '</pre>';
   }
   $i++;
}
Изменено: Sillys - 1 Марта 2013 12:15
Всем спасибо, а особенно Sillys!
Тему можно закрывать!
Страницы: 1 2 След.
Похожие темы:
Читают тему (гостей: 1, пользователей: 0, из них скрытых: 0)
Новые темыОбъявленияСвободное общение
22:27 LOSPOLLOS.COM - Конвертим по рецепту Хайзенберга. Dating, Mainstream, Binary Options 
12:39 2Index - быстрая индексация страниц сайта и обратных ссылок 
06:17 3snet - гемблинг, беттинг, форекс, бинарные опционы, майнинг 
11:46 SharkBoss - партнёрская программа для монетизации ЛЮБЫХ видов трафика (включая спам). 
23:10 Dao.AD: Монетизация и покупка Push/Pops/Inpage и Video трафика! 
21:20 Rotapost прикрыли! Чем пользоваться? 
00:23 Раскрутка форума 
13:38 BIGPROXY.SHOP - Резидентные Ротационные Backconnect Proxy USA EUROPA MIX [Безлимитный трафик] 
13:16 PonyBit.ru - обменный пункт PonyBit.ru (Понибит.ру) 
12:46 Мобильные и Резидентные Прокси Для Соц Сетей | 3 Гб Бесплатно 
12:12 CryptoGraph — Анонимный обмен криптовалют без KYC и AML 
10:46 Linken Sphere – браузер-антидетект нового поколения 
05:06 CoinCapital  
04:28 Просто $0.04/IP 9PROXY.COM Резидентные прокси Неограниченная пропускная способность Уникальная политика замены Без чёрного списка 
13:08 Бесплатный майнинг Tether (USDT) 
10:29 С юмором по жизни! 
16:49 monetizer.agency – рекламная сеть для взрослого и развлекательного трафика. 100$ новому вебмастеру 
20:43 Добро пожаловать в цифровой мир... 
15:59 Про мясо 
23:09 ПП от PMS remote.team - 200$ за команду 
13:28 Компьютерная мышь