Как записать переменную в xml

alexz15

Постоялец
Регистрация
3 Окт 2008
Сообщения
394
Реакции
194
Всем привет!

Есть content.xml:
Код:
<videos>
    <video>
        <title>title 1</title>
        <duration>05:03</duration>
        <views>3598 views</views>
        <date>21 Nov</date>
    </video>
    <video>
        <title>title 2</title>
        <duration>03:00</duration>
        <views>191 views</views>
        <date>23 Dec</date>
    </video>
    <video>
        <title>title 3</title>
        <duration>03:50</duration>
        <views>1941 views</views>
        <date>25 Dec</date>
    </video>
</videos>
C помощью SimpleXML, я получаю все title в переменную и обрабатываю их функцией:
PHP:
<?php
$xml =  simplexml_load_file('content.xml');
foreach ($xml->video as $item) {
    $content = $item -> title."\n";
    $cont .= $content;
}
/* переменной $cont:
title 1
title 2
title 3
##################*/
 
// обработка
$cont = function_google_translate ($cont);
/* переменной $cont:
my_title 1
my_title 2
my_title 3
##################*/
?>
Теперь вопрос, как "засунуть" обратно все обработанные my_title в my_content.xml:
Код:
<videos>
    <video>
        <title>my_title 1</title>
        <duration>05:03</duration>
        <views>3598 views</views>
        <date>21 Nov</date>
    </video>
    <video>
        <title>my_title 2</title>
        <duration>03:00</duration>
        <views>191 views</views>
        <date>23 Dec</date>
    </video>
    <video>
        <title>my_title 3</title>
        <duration>03:50</duration>
        <views>1941 views</views>
        <date>25 Dec</date>
    </video>
</videos>
 
На вскидку вот так примерно и не надо с объектами заморачиваться.
PHP:
function replace($matches){
    return '<title>'.$matches[1].'*</title>';
}
header("Content-Type: text/html; charset=utf-8");
$xml = '<videos>
    <video>
        <title>title 1</title>
        <duration>05:03</duration>
        <views>3598 views</views>
        <date>21 Nov</date>
    </video>
    <video>
        <title>title 2</title>
        <duration>03:00</duration>
        <views>191 views</views>
        <date>23 Dec</date>
    </video>
    <video>
        <title>title 3</title>
        <duration>03:50</duration>
        <views>1941 views</views>
        <date>25 Dec</date>
    </video>
</videos>';
$xml = preg_replace_callback('/<title>(.*)<\/title>/', 'replace', $xml);
/*
<videos>
    <video>
        <title>title 1*</title>
        <duration>05:03</duration>
        <views>3598 views</views>
        <date>21 Nov</date>
    </video>
    <video>
        <title>title 2*</title>
        <duration>03:00</duration>
        <views>191 views</views>
        <date>23 Dec</date>
    </video>
    <video>
        <title>title 3*</title>
        <duration>03:50</duration>
        <views>1941 views</views>
        <date>25 Dec</date>
    </video>
</videos>
*/
 
Спасибо, уже что-то начинает проясняться)
только не могу понять - в функцию replace нужно добавить какой-то массив?
вот что я сейчас делаю:
так выглядит файл content.xml (там 144 title:(
Код:
<?xml version="1.0" encoding="utf-8"?><videos><video><foolurl>61467/news1.php</foolurl><title>61467/ Title 1</title><thumb>322144_1.jpg</thumb><duration>38:06</duration><views>12 views</views><date>28 Dec</date></video><video><foolurl>61468/news2.php</foolurl><title>61468/ Title 2</title><thumb>322145_1.jpg</thumb><duration>05:06</duration><views>14 views</views><date>28 Dec</date></video><video><foolurl>61469/news3.php</foolurl><title>61469/ Title 3</title><thumb>322146_1.jpg</thumb><duration>03:44</duration><views>14 views</views><date>28 Dec</date></video></videos>
и кстати, этот файл я получаю из массива:
Код:
Array
(
    [0] => Array
        (
            [foolurl] => 61467/news1.php
            [title] => 61467/ Title 1
            [thumb] => 141515_1.jpg
            [duration] => 03:25
            [views] => 8162 views
            [date] => 16 Dec
        )
 
    [1] => Array
        (
            [foolurl] => 61468/news2.php
            [title] => 61468/ Title 2
            [thumb] => 162566_1.jpg
            [duration] => 03:05
            [views] => 5218 views
            [date] => 29 Nov
        )
 
    [2] => Array
        (
            [foolurl] => 61469/news3.php
            [title] => 61469/ Title 3
            [thumb] => 170915_1.jpg
            [duration] => 16:18
            [views] => 3596 views
            [date] => 24 Dec
        )
 
	[143] => Array
...
 
)
может лучше сразу из него переводить гуглом?

вот как я думаю переводить:
PHP:
header ('Content-type: text/html; charset=utf-8');
$xml = simplexml_load_file('content.xml');
 
$xml = $xml->video;
 
foreach ($xml as $item) {
    $content = $item -> title." | ";
    $cont .= $content;
}
 
$trance = translator_google($cont); // переводим
$trance = str_replace(' | ', "|", $trance);  // удаляем пробелы..
$trance = str_replace(' |', "", $trance); // удаляем последний символ
//$trance = str_replace('|', "\n", $trance);
 
echo $trance; // готовый перевод
Но что дальше с этим делать вообще не могу сообразить...
 
ураа ))
трое суток мучился, но додумался )

полученный массив[title] преобразовал в строку implode, затем перевел на нужный язык, затем - explode и "соединил" titles с помощью simplexml.
PHP:
$xml = simplexml_load_file($xml);
for($i=0;$i<=$count;$i++)
{
    $xml->video[$i]->title = $titles[$i];
}        
$xml->asXML('content.xml');
 
или вместо
foreach ($xml as $item)

написать foreach ($xml as &$item)

а далее $item->title = 'content';

 
Отдыхал все праздники и не мог ответить.
только не могу понять - в функцию replace нужно добавить какой-то массив?
Функция preg_replace_callback передает массив, как именно он формируется посмотри в документации php. Для просмотра ссылки Войди или Зарегистрируйся
Чтоб переводило сразу в моем варианте нужно функцию переписать так.
PHP:
function replace($matches){
    return '<title>'.translator_google($matches[1]).'*</title>';
}
Соответственно content.xml считывать file_get_contents.
так выглядит файл content.xml (там 144 title:(
Именно поэтому я и не сторонник обработки xml через объекты и массивы, ИМХО это конкретно замедляет скорость работы скрипта, хотя опять же надо тестить...
 
Назад
Сверху