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

Тема в разделе "Как сделать...", создана пользователем alexz15, 28 дек 2011.

  1. alexz15

    alexz15

    Регистр.:
    3 окт 2008
    Сообщения:
    394
    Симпатии:
    189
    Всем привет!

    Есть 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>
     
  2. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    На вскидку вот так примерно и не надо с объектами заморачиваться.
    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>
    */
     
    alexz15 нравится это.
  3. alexz15

    alexz15

    Регистр.:
    3 окт 2008
    Сообщения:
    394
    Симпатии:
    189
    Спасибо, уже что-то начинает проясняться)
    только не могу понять - в функцию 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// готовый перевод
    Но что дальше с этим делать вообще не могу сообразить...
     
  4. alexz15

    alexz15

    Регистр.:
    3 окт 2008
    Сообщения:
    394
    Симпатии:
    189
    ураа ))
    трое суток мучился, но додумался )

    полученный массив[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');
     
  5. uerter

    uerter Писатель

    Регистр.:
    5 дек 2008
    Сообщения:
    6
    Симпатии:
    2
    или вместо
    foreach ($xml as $item)

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

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

     
  6. a_n_d_y

    a_n_d_y

    Регистр.:
    26 мар 2006
    Сообщения:
    465
    Симпатии:
    61
    Отдыхал все праздники и не мог ответить.
    Функция preg_replace_callback передает массив, как именно он формируется посмотри в документации php. http://www.php.net/manual/en/function.preg-replace-callback.php
    Чтоб переводило сразу в моем варианте нужно функцию переписать так.
    PHP:
    function replace($matches){
        return 
    '<title>'.translator_google($matches[1]).'*</title>';
    }
    Соответственно content.xml считывать file_get_contents.
    Именно поэтому я и не сторонник обработки xml через объекты и массивы, ИМХО это конкретно замедляет скорость работы скрипта, хотя опять же надо тестить...