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
Форумы портала PHP.SU :: Версия для печати :: Редактирование XML
Форумы портала PHP.SU » » XML и его обработка » Редактирование XML

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

1. eFusion - 30 Мая, 2014 - 15:37:40 - перейти к сообщению
Есть кусок 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>.
Есть предложения?
2. armancho7777777 - 30 Мая, 2014 - 17:09:23 - перейти к сообщению
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. }
3. eFusion - 30 Мая, 2014 - 17:45:25 - перейти к сообщению
Ошибок нет и ничего не изменилось в исходном файле.
4. armancho7777777 - 30 Мая, 2014 - 19:28:30 - перейти к сообщению
А Вы его сохранили ?
5. eFusion - 31 Мая, 2014 - 17:04:02 - перейти к сообщению
Крутяк! Спасибо! То что нужно!

И да, действительно, забыл сохранить его.
6. armancho7777777 - 31 Мая, 2014 - 17:18:15 - перейти к сообщению
Не за что.
7. eFusion - 31 Мая, 2014 - 17:47:33 - перейти к сообщению
А как-то можно вычленить из stop="20140529080000 +0300" только число 20140529080000 и его уже изменять как угодно?
8. armancho7777777 - 31 Мая, 2014 - 18:00:02 - перейти к сообщению
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. }
9. eFusion - 31 Мая, 2014 - 18:16:16 - перейти к сообщению
Я неправильно объяснил... Пардон.
Имел ввиду foreach прогнать как-то так, чтобы получить, изменить и сохранить параметры, которые идут внутри stop=" тут то, что нужно менять " во всем xml файле.
10. armancho7777777 - 31 Мая, 2014 - 18:22:18 - перейти к сообщению
armancho7777777 пишет:
А вообще, смещение ("+0300") лучше в отдельном атрибуте хранить.
11. eFusion - 31 Мая, 2014 - 18:25:17 - перейти к сообщению
К сожалению, получаю готовый файл и уже с ним работаю, а менять еще и это не хотелось бы т.к. не настолько еще владею парсингом xml Огорчение
12. armancho7777777 - 31 Мая, 2014 - 18:33:36 - перейти к сообщению
Я ничего не понял из того, что Вы объяснили, но попробую догадаться:
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. }
13. eFusion - 31 Мая, 2014 - 18:41:40 - перейти к сообщению
Попробую объяснить так:
есть файл 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".
Нужно изменить это число(жирным шрифтом) во всех блоках.
14. armancho7777777 - 31 Мая, 2014 - 19:58:53 - перейти к сообщению
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. }
15. eFusion - 31 Мая, 2014 - 20:08:18 - перейти к сообщению
Спасибо за терпение, выдержку и помощь!
И простите за тупое объяснение задачи Улыбка

 

Powered by ExBB FM 1.0 RC1