Вывести нужные поля из 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)
Новые темыОбъявленияСвободное общение
11:07 01.02. Апдейт 31.01 // Chrome готовит "чёрную метку" для ИИ? 
06:34 Гугл пухнет от кеша, а нам - крошки. Разбор $114 млрд: Адсенс в минусе, Ютуб на подписках 
01:09 Yahoo Scout: Нейро-привет из склепа. Реальный шанс на траф или мимо? 
17:33 AntiBot Cloud - бесплатный скрипт и сервис защиты сайтов 
15:14 Апдейт Яндекса 7 февраля. Пока серп трясет, некоторые по ботам плачут 
15:10 Google Discover Core Update: Дискавер отделяют от поиска? 
11:30 ЕС душит ТикТок: прощай бесконечная лента и RPM? Что с монетизацией? 
04:09 Просто $0.04/IP 9PROXY.COM Резидентные прокси Неограниченная пропускная способность Уникальная политика замены Без чёрного списка 
02:31 Профессиональный и грамотный дизайн от DesignCash 
18:27 Nexulume.com Обменник без AML и KYC 
15:45 Mixmasters - Exchange without AML and KYC 
10:22 Swapwatch.org — Мониторинг криптовалютных обменников 
10:19 SwapPix.io - быстрый и безопасный обменник криптовалют. 
15:12 CryptoGraph — Анонимный обмен криптовалют без KYC и AML 
02:08 K*R*A*K*EN // ссылка на февраль 2026 
00:28 Кулеры и БП станут золотыми? Медь по 13 штук, олово в космосе 
23:44 Точные прогнозы на футбол 
18:34 Ставки на супер тренды в спорте 
15:30 Гильотина для классиков: Клод доедает физические книги 
11:10 Moltbook: Соцсеть для ботов, где людям закрыли рот. Началось? 
22:31 [AI] Бот за $600к советовал есть сыр с крысами. Нью-Йорк его (наконец-то) снес