Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Тексты > Проблема при чтении xml файла


Автор: wolfness 24.9.2009, 14:45
Задача стоит такая: Прочитать xml файл типа 
Код

<abouts>
<item id="jeans" text="jeans">Строка 1</item>
<item id="tshirt" text="tshirt">Строка 2</item>
</abouts> 

Затем считать данные находящиеся на месте Строка 1 и строка 2 и вывести их в текстовое поле input type=text или textarea затем изменить данные и записать вместо старых.
Делают так :
Код

/*$f = fopen ("../copyright.xml", "r+");

    while (!feof($f))

    {

      //$st = fgets($f);

      //$res = substr($st, strpos($st, ">")+1, -7);

      //echo $st."<br />";

      //echo $res;

      global $per;   

      $per = $st;

    }

    fclose($f);   

   */
if ($_POST['edit_copyright_1'])

{

   echo $per;

}

.....
echo "<form name='copyright' action='' method='POST'>";

echo "<INPUT type='text' name='text_copyright_1' value='".$per."'>";

echo "<INPUT type='submit' name='edit_copyright_1' value='Редактировать'>";

echo "</form>"; 

Но постоянно забивается память. Чушь какая то получается. Если делать все через пост, то вывести значение из строки в форму не получается т.к. это значение не видно.
Как это можно сделать? Может вообще есть ф-ции работы с xml файлами?

Автор: Ипатьев 24.9.2009, 14:48
Что значит "забивается память"?
Что значит "чушь какая-то получается"?
Что значит "это значение не видно"? где не видно? какое значение? При чем здесь POST?

На каком этапе происходит проблема? Не получается считать данные?
Не получается вывести в форму?
Не получается отредактировать?
Не получается принять форму?
Не получается записать XML обратно?

Автор: wolfness 25.9.2009, 05:35
Пробовал делать так:
Код

    $f = fopen ("../copyright.xml", "r+");

    fseek($f, 10, SEEK_SET);

    $st1 = fgets($f);

    $res1 = substr($st1, stripos($st1, ">")+1, -9); //получаю строку начинающуюся после символа '>' длиной от этого символа до -7 символов до конца строки

    //echo $res1."<br />";

    $st2 = fgets($f);

    $res2 = substr($st2, stripos($st2, ">")+1, -9);

    //echo $res2;

    fclose($f);

if ($_POST['edit_copyright_1'])

{

    $f = fopen ("../copyright.xml", "r+");

    fseek($f, 10, SEEK_SET);

    $stroka = fgets($f);

    $repl = substr($stroka, stripos($stroka, ">")+1, -9);

    $st1 = $_POST['text_copyright_1'];

    $result_1 = str_replace($repl, $st1, $stroka);

    fputs($f, $result_1);

    //fseek($f, 10, SEEK_SET);

    //$stroka = fgets($f);

    //fseek($f, 10, SEEK_SET);

    fclose($f);

}
if ($_POST['edit_copyright_2'])

{

    //$_POST['text_copyright_2'] = $res2; //в текстовое поле записывается значение найденной строки

}
echo "<form name='copyright' action='' method='POST'>";

echo "<INPUT type='text' name='text_copyright_1' value='".$result_1."'>";

echo "<INPUT type='submit' name='edit_copyright_1' value='Редактировать'><br />";

echo "<INPUT type='text' name='text_copyright_2' value='".$res2."'>";

echo "<INPUT type='submit' name='edit_copyright_2' value='Редактировать'>";

echo "</form>";

Записываю в файл во вторую строку "Hellouin town". Она записывается в третью и в итоге получается такое
Код

<abouts>

<item id="firstline" text="">Item 1</item>

<item id="firstline" text="">Hellouin town</item>

ts>

еще и съедается часть символов. А по идее по клику первой кнопки изменяется информация Item 1, по клику второй Item 2 

Автор: NewDima 25.9.2009, 06:48
wolfness, тебе задали конкретные вопросы, ты на них не ответил.
Хочешь, чтобы на твой абсолютно неконкретный вопрос ответили?

Автор: wolfness 25.9.2009, 07:06
отвечаю:
1) Вопрос снял. С памятью решил вопрос.
2) Насчет чуши я выше показал что записывается не в ту строку и еще съедается лишние символы.
3) Со значениями и постом вопрос пока снял. Сделал немного по другому.
4) Как я понимаю проблема возникает на этапе записи замененной подстроки в файл. Замена происходит корректно, а вот запись нет. увы.
5) ,6), 7), 8) не добрался до этих вопросов. хочу сначала понять почему происходит некорректная запись
9) да. xml обратно не записывается как надо.

Автор: Ипатьев 25.9.2009, 11:12
как можно не добраться до этих вопросов, если они решаются ДО записи?

записывать через fseek нельзя. как бы, можно сообразить, что вставленная строка не раздвигает данные, а затирает.
надо заново формировать весь XML
и таки да, лучше воспользоваться встроенными функциями для работы с XML, в РНР их море.

А лучше всего - не работать, по возможности, с этим кривым форматом вообще.
Если есть возможность записывать не обратно в этот же файл, а в базу данных, то так и следует поступить.

Автор: NewDima 25.9.2009, 13:02
Ипатьев, не работать с xml?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)