Динамическое изменение атрибутов в xml
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Динамическое изменение атрибутов в xml Expand / Collapse
Автор
Сообщение
25.04.2007 19:59
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 25.11.2007 22:43
Сообщ.: 61, Visits: 674
В xml-шаблоне, показанном ниже, мне нужно изменить по определённому действию пользователя атрибут src тега img. Так как у тега img есть id логично было бы добираться до него так

$col = $document->getElementById($id);

а потом применять replaceAttribute, но replaceAttribute вызывает ошибку

Call to a member function replaceAttribute() on a non-object 

Как это сделать правильно?

Вот шаблон

<MENU>
<TABLE cellSpacing=0 cellPadding=4 width="100%">
<TBODY>
<TR height=50>
<TD align=left width="20%" background=./backgrounds/ser14.gif><A href=""><IMG id=0 src="item1.gif" border=0></A></TD>
<TD align=left width="20%" background=./backgrounds/ser14.gif><A href=""><IMG id=1 src="item2.gif" border=0></A></TD>
<TD align=left width="20%" background=./backgrounds/ser14.gif><A href=""><IMG id=2 src="item3.gif" border=0></A></TD>
<TD align=left width="20%" background=./backgrounds/ser14.gif><A href=""><IMG id=3 src="item4.gif" border=0></A></TD>
<TD align=left width="20%" background=./backgrounds/ser14.gif><A href=""><IMG id=4 src="item5.gif" border=0></A></TD>
</TR>
</TBODY>
</TABLE>
</MENU>

Дерево xml-документа я получаю так

define('XMLHead', "<?xml version=\"1.0\" encoding=\"Windows-1251\" ?>");
$document = new domDocument("Windows-1251");
$menu = file_get_contents("../templates/top_menu.html"); //это тот самый xml
$menu_doc = XMLHead.$menu;
$document->loadXML($menu_doc);

Прошу прощения, но запостить xml не смог :(

Сообщ. #912811
26.04.2007 9:55
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
sugee, я исправил твое сообщение так чтобы XML правильно отображался. На будущее имей в виду, если у тебя не отображаются теги, то замени вручную у них < на &lt;, > на &gt; и все будет в порядке.

Что касается сути вопроса, то надо понимать что id атрибут сам по себе для XML является таким же атрибутом как и все остальные. Чтобы XML начал воспринимать его его как уникальный id и, соответстветнно, могла работать функция getElementById, надо сделать DTD для документа или XML-схему где указать, что атрибут id тега <img> является уникальным идентификатором. Кроме того, значение id в xml не может начинаться с цифры.

Сообщ. #912815
26.04.2007 21:34
Forum Guru

Forum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum GuruForum Guru

участник
Last Login: 25.11.2007 22:43
Сообщ.: 61, Visits: 674
Это понял, спасибо.
А вот изменить атрибут так и не получается.
Я не стал писать DTD, добираюсь до нужной ноды так:
$img = $document->getElementsByTagName("img");
for ($i=0; $i < $img->length; $i++) {
$ob = $img->item($i);
$attr = $ob->attributes;
if ($attr->getNamedItem("id")->nodeValue == $id) {

//тег img который мне нужен

}


Насчёт метода replaceAttribute я погорячился, не помню откуда я его взял, но похоже в PHP такого нет, во всяком случае поиск по php.net не дал результатов.
Так как же всё-таки изменить значение атрибута?

Вообще замысел такой, по определённому действию пользователя значение атрибута изменяется на выбранное им, и это изменение должно быть
не только показано в браузере но и сохранено в xml-файле.
Сохранение, как я понимаю, реализуется через метод saveXML и перезапись файла строкой, которую возвращает этот метод.
Таким же образом можно будет менять url в ссылках и т.п.

Но для начала нужно понять, как редактировать атрибуты.
Сообщ. #912820
27.04.2007 9:51
Supreme Being

Supreme Being

модератор
Last Login: 04.05.2008 13:32
Сообщ.: 7 240, Visits: 65 445
Ты пользуешься классом domDocument. Изучай список его свойств и методов.
Сообщ. #912824
« пред. тема | след. тема »


Эту тему читают Expand / Collapse
Посетители: 0 (0 гостей, 0 участников, 0 скрыт.участников)
Сейчас нет участников, просматривающих тему.
Модераторы: Alexey, boombastik, bazile, pl

Время GMT +3:00, Сейчас 5:15