Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Редактирование XML

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
eFusion
Отправлено: 30 Мая, 2014 - 15:37:40
Post Id


Новичок


Покинул форум
Сообщений всего: 49
Дата рег-ции: Апр. 2013  
Откуда: Украина, Донецк


Помог: 0 раз(а)




Есть кусок xml:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <tv>
  2.   .
  3.   .
  4.   .
  5.   .
  6.   <programme start="20140529080000 +0300" stop="20140529080000 +0300" channel="4">
  7.     <title>М/с Маленький зоомагазин</title>
  8.     <category lang="ru">Для детей</category>
  9.   </programme>
  10.   <programme start="20140529083000 +0300" stop="20140529083000 +0300" channel="4">
  11.     <title>М/с Джейк и пираты из Нетландии</title>
  12.     <category lang="ru">Для детей</category>
  13.   </programme>
  14. </tv>


Нужно изменить stop="20140529080000 +0300" в каждом блоке <programme>.
Делаю так:
PHP:
скопировать код в буфер обмена
  1. $xml = simplexml_load_file('test.xml');.
  2. $dom_sxe = dom_import_simplexml($xml);.
  3. $dom = new DOMDocument('1.0', 'UTF-8');.
  4. $dom_sxe = $dom->importNode($dom_sxe, true);.
  5. $dom_sxe = $dom->appendChild($dom_sxe);.
  6. $xpath = new DOMXPath($dom);.
  7. $pos = $xpath->evaluate('count(//programme[stop="20140529080000 +0300"]/preceding-sibling::*)');.
  8. $xml->programme[intval($pos)]->stop = "20140529080001 +0300";.
  9. $xml->asXML('test.xml');

но вставляется строка вида:
<stop>20140529080001 +0300</stop> перед </programme>.
Есть предложения?
 
 Top
armancho7777777 Супермодератор
Отправлено: 30 Мая, 2014 - 17:09:23
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




PHP:
скопировать код в буфер обмена
  1. $dom = new DOMDocument('1.0', 'UTF-8');
  2. $dom->loadXML(file_get_contents('test.xml'));
  3. $xPath = new DOMXPath($dom);
  4.  
  5. foreach($xPath->query('//programme[@stop="20140529080000 +0300"]') as $item)
  6. {
  7.     $item->setAttribute('stop', '20140529080001 +0300');
  8. }
 
 Top
eFusion
Отправлено: 30 Мая, 2014 - 17:45:25
Post Id


Новичок


Покинул форум
Сообщений всего: 49
Дата рег-ции: Апр. 2013  
Откуда: Украина, Донецк


Помог: 0 раз(а)




Ошибок нет и ничего не изменилось в исходном файле.
 
 Top
armancho7777777 Супермодератор
Отправлено: 30 Мая, 2014 - 19:28:30
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




А Вы его сохранили ?
 
 Top
eFusion
Отправлено: 31 Мая, 2014 - 17:04:02
Post Id


Новичок


Покинул форум
Сообщений всего: 49
Дата рег-ции: Апр. 2013  
Откуда: Украина, Донецк


Помог: 0 раз(а)




Крутяк! Спасибо! То что нужно!

И да, действительно, забыл сохранить его.
 
 Top
armancho7777777 Супермодератор
Отправлено: 31 Мая, 2014 - 17:18:15
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Не за что.
 
 Top
eFusion
Отправлено: 31 Мая, 2014 - 17:47:33
Post Id


Новичок


Покинул форум
Сообщений всего: 49
Дата рег-ции: Апр. 2013  
Откуда: Украина, Донецк


Помог: 0 раз(а)




А как-то можно вычленить из stop="20140529080000 +0300" только число 20140529080000 и его уже изменять как угодно?
 
 Top
armancho7777777 Супермодератор
Отправлено: 31 Мая, 2014 - 18:00:02
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




PHP:
скопировать код в буфер обмена
  1. foreach($xPath->query('//programme[@stop="20140529080000 +0300"]') as $item)
  2. {
  3.     list($mTime, $offset) = explode(' ', $item->getAttribute('stop'));
  4.     $mTime += 3600;
  5.    
  6.     $item->setAttribute('stop', $mTime . ' +0300');
  7. }


А вообще, смещение ("+0300") лучше в отдельном атрибуте хранить.
CODE (xml):
скопировать код в буфер обмена
  1. <programme start="20140529080000"
  2.            stop="20140529080000"
  3.            offset="+0300"
  4.            channel="4">
  5. </programme>

PHP:
скопировать код в буфер обмена
  1. foreach($xPath->query('//programme[@stop="20140529080000"]') as $item)
  2. {
  3.     $item->setAttribute('stop', $item->getAttribute('stop') + 3600);
  4. }

(Отредактировано автором: 31 Мая, 2014 - 18:10:15)

 
 Top
eFusion
Отправлено: 31 Мая, 2014 - 18:16:16
Post Id


Новичок


Покинул форум
Сообщений всего: 49
Дата рег-ции: Апр. 2013  
Откуда: Украина, Донецк


Помог: 0 раз(а)




Я неправильно объяснил... Пардон.
Имел ввиду foreach прогнать как-то так, чтобы получить, изменить и сохранить параметры, которые идут внутри stop=" тут то, что нужно менять " во всем xml файле.
 
 Top
armancho7777777 Супермодератор
Отправлено: 31 Мая, 2014 - 18:22:18
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




armancho7777777 пишет:
А вообще, смещение ("+0300") лучше в отдельном атрибуте хранить.
 
 Top
eFusion
Отправлено: 31 Мая, 2014 - 18:25:17
Post Id


Новичок


Покинул форум
Сообщений всего: 49
Дата рег-ции: Апр. 2013  
Откуда: Украина, Донецк


Помог: 0 раз(а)




К сожалению, получаю готовый файл и уже с ним работаю, а менять еще и это не хотелось бы т.к. не настолько еще владею парсингом xml Огорчение
 
 Top
armancho7777777 Супермодератор
Отправлено: 31 Мая, 2014 - 18:33:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Я ничего не понял из того, что Вы объяснили, но попробую догадаться:
PHP:
скопировать код в буфер обмена
  1. $query = "//programme[starts-with(@stop, '20140529080000')]";
  2.  
  3. foreach($xPath->query($query) as $item)
  4. {
  5.     list($mTime, $offset) = explode(' ', $item->getAttribute('stop'));
  6.     $mTime += 3600;
  7.  
  8.     $item->setAttribute('stop', $mTime . ' +0300');
  9. }

(Отредактировано автором: 31 Мая, 2014 - 18:34:29)

 
 Top
eFusion
Отправлено: 31 Мая, 2014 - 18:41:40
Post Id


Новичок


Покинул форум
Сообщений всего: 49
Дата рег-ции: Апр. 2013  
Откуда: Украина, Донецк


Помог: 0 раз(а)




Попробую объяснить так:
есть файл xml:
CODE (htmlphp):
скопировать код в буфер обмена
  1. <tv>
  2.   <programme start="20140529080000 +0300" stop="20140529080000 +0300" channel="4">
  3.     <title>М/с Маленький зоомагазин</title>
  4.     <category lang="ru">Для детей</category>
  5.   </programme>
  6.   <programme start="20140529083000 +0300" stop="20140529083000 +0300" channel="4">
  7.     <title>М/с Джейк и пираты из Нетландии</title>
  8.     <category lang="ru">Для детей</category>
  9.   </programme>
  10. </tv>


Блоков <programme></programme> порядка 300 штук.
В каждом из них есть stop="тут число у всех разное +0300".
Нужно изменить это число(жирным шрифтом) во всех блоках.
 
 Top
armancho7777777 Супермодератор
Отправлено: 31 Мая, 2014 - 19:58:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




PHP:
скопировать код в буфер обмена
  1. foreach($xPath->query("//programme[@stop]") as $item)
  2. {
  3.     list($mTime, $offset) = explode(' ', $item->getAttribute('stop'));
  4.     $mTime += 3600;
  5.  
  6.     $item->setAttribute('stop', $mTime . ' ' . $offset);
  7. }

(Отредактировано автором: 31 Мая, 2014 - 19:59:53)

 
 Top
eFusion
Отправлено: 31 Мая, 2014 - 20:08:18
Post Id


Новичок


Покинул форум
Сообщений всего: 49
Дата рег-ции: Апр. 2013  
Откуда: Украина, Донецк


Помог: 0 раз(а)




Спасибо за терпение, выдержку и помощь!
И простите за тупое объяснение задачи Улыбка
 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« XML и его обработка »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB