xPath как по условию поиска получить в виде результата все дочерние объекты ноды

StealtH

Новичок
xPath как по условию поиска получить в виде результата все дочерние объекты ноды

Добрый день уважаемый ALL!

Вкратце опишу суть и смысл задачи:

Есть приложение, которое реализовано на PHP4 с хранением вводимых данных в XML(такой подход использовался из-за неточно сформированного конечным пользователем ТЗ, как обычно, сначало надо было одно, потом планы поменялись в сторону наращивания функционала). Данные - клиентские заказы, объем которых очень мал. На момент старта проекта предполагалось, что приложение будет не очень часто использоваться, и основной формат обмена должен был быть именно XML, для просты экспорта в Excel. Как обычно - аппетит приходит во время еды и со временем потребовалось расширение функционала, так же начал рости объем данных. Обработка большого объема XML-данных "отнимает" большой объем ресурсов, по-этому для реализации поиска определенных данных в XML-файле уже не возможно дальше продолжать через механизмы пхп. Именно по-этому взгляд упал на Xpath, при первых тестах впечатление сложилось положительное, но начали возникать вопросы.

При поиске по определенному параметру необходимо, чтобы в результирующий набор данных включалась вся ветка данных в которой было найдено соответствующее совпадение и чтобы данные отдавались в виде массива. Так же не понятно как сделать условием выборки по нескольким параметрам.

Просьба сильно не пинать за возможно глупые вопросы т.к. я об xPath узнал буквально вчера методам гугления, по-этому опыта работы с ним пока что нет. По-этому, если есть возможность - киньте линкой на документации по сабжу. Ниже пример кода, на которым сейчас провожу эксперименты. Интересует именно принцип и порядок формирования условий для выборки и как правильно с точки зрения синтаксиса сформировать запрос, чтобы в переменную $result были отданы все дочерние объекты ноды transfer

PHP:
<?
     $dom1 = domxml_open_file("test.xml"); 
     $context = xpath_new_context($dom1); 
     $result = xpath_eval($context, '/neworders/transfer/customer/company="companyName"'); 
     print_r($result);  
?>
 

atv

Новичок
Код:
//transfer[//company="companyName"]/*
Не видя исходного XML трудно составить выражение, приблизительно будет так
 

slach

Новичок
StealtH
в этом форуме висит тема, где есть ссылки на туториалы от Zvon.org по XPath найди ее и изучи
atv правильный код показал
 

StealtH

Новичок
Спасибо всем ответившим!

atv действительно привел правильный код, который сделал выборку, но результат работы по времени - еще дольше чем при обработке всего массива средствами пхп :( в оконцовке скрипт вернул набор данных около 5тыщ, все в виде одного одномерного массива без сохранения структуры самих данных. Т.е. мало того, что скорости не прибавилось, так еще и "в нагрузку" прибавились накладные расходы на структурирование полученных данных.

Спасибо за ссылку на примеры, сегодня изучу сей ценный материал.
 

atv

Новичок
все в виде одного одномерного массива без сохранения структуры самих данных.[/quiote]
Ты просто ещё не до конца разобрался. Запрос возвращает набор объектов DOMElement, в котором есть свойства и методы для доступа к атрибутам и дочерним элементам, а также к соседним и родительским элементам. Поизучай ещё и DOM API.

мало того, что скорости не прибавилось
попробуй оптимизировать так
Код:
/neworders/transfer[//company="companyName"]/*
А вообще, посмотри в сторону расширения XmlReader, правда там придётся вручную писать выборку необходимых узлов.
 

FB3

Новичок
Я бы написал так:
'/neworders/transfer[customer/company="companyName"]/node()'
Так должно работать быстрее всего, если нигде не ошибся, и выбирать только ноды, звездочка выбирает еще и атрибуты самого 'transfer'.
'customer/company' - уточняет условия, где искать, соответсвенно, поиск также будет перебирать куда меньше.
С двумя слэшами '//company' вообще не должно работать правильно, потому что '//' означает проход по всему документу. Если уж так и писать, то правильней будет './/company'
 
Сверху