Форум Академгородка, Новосибирск > DOMElement + xmlns
Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: DOMElement + xmlns
Форум Академгородка, Новосибирск > Компьютеры и сети > Программирование > WEB-программирование
Zebooka
Сколько не бьюсь, так и не понятно. Нигде толком не написано ничего.

Суть - есть оригинальный XML документ с namespace'ами. При помощи XPath из него выдергиваются определенные узлы, которые потом будут использоваться по отдельности как самостоятельные DOMDocument'ы.

Проблема в том, что когда делаешь saveXML($node) у получившегося кода в корневом узле нету родительских xmlns аттрибутов. Как бы их туда скопировать?

Причем можно их у него узнать через метод lookupNamespaceURI, но ведь я не знаю всех префиксов в документе...
И как аттрибуты их не выдернешь.

Самый брутфорсный метод, который приходит на ум - получить список ВСЕХ предков и потомков, и посмотреть их префикс, через который и узнать namespaceURI
Zebooka
Плюнул на все и решил проблему брутфорсом.
Так не совсем правильно т.к. если нэймспейс не используется ни в одном в проверяемом узле, то он не будет скопирован.

Код
$nsPrefixes = array();
// Получить всех предков, себя и потомков.
$nss = $xpath->query('ancestor::*|self::*|descendant::*', $node);
// Собрать префиксы у этих узлов
foreach ($nss as $ns)
    $nsPrefixes[$ns->prefix] = ($ns->prefix !== '' ? $ns->prefix : null);
// Проверить, что у нас действительно есть в данном узле нэймспэйс для такого префикса и установить его.
foreach ($nsPrefixes as $np)
{
    $uri = $node->lookupNamespaceURI($np);
    if ($uri !== null && $uri !== '')
        $node->setAttribute('xmlns'.($np !== '' ? ':'.$np : ''), $uri);
}
anpol
Цитата(Zebooka @ 14.01.2010, 11:55) *
у получившегося кода в корневом узле нету родительских xmlns аттрибутов. Как бы их туда скопировать?

Нужно создать новый документ и сделать в него importNode:
Цитата
…importing a node creates a node object owned by the importing document, with attribute values identical to the source node's nodeName and nodeType, plus the attributes related to namespaces (prefix, localName, and namespaceURI).

Полученный узел можно сохранить.

Может быть, получится импортировать узел в тот же самый документ.
Zebooka
Спасибо. Щас попробую.
Zebooka
Эффект получается такой же smile.gif
То, что в узле используется - копируется, остальное нет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Русская версия IP.Board © 2001-2024 IPS, Inc.