Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Perl: Общие вопросы > Разбор XML |
Автор: AndreyCH 20.3.2009, 16:57 | ||||||
Вот для моего класса нужен метод, который распарсит строку и вычленить оттуда название тэга и его значение. есть 2 метода. 1. файл util.pl
2. XML файл, который будем разбирать users.xml
Ну и код которым парсим test.pl
Это сейчас так работает. А вот это хочу сделать для обучения: Есть вышеприведенный XML файл. Сразу скажу: "Формирую его только я и никто другой, структура заранее известна и приведена в файле". ![]() ![]() Так вот я хочу сделать вот так: Открыл файл. Нашел первый тэг (целое слово внутри угловых скобок). Получил имя этого тэга $1. Нашел закрывающий тэг $3 (по полученному имени) и все что внутри $2. Перешел к обработке второго тэга, третьего и т.д. Меня интересует именно "академически" как это сделать внутри одного рег. выражения. Не хотелось бы сначала первым рег. выражением получать первый тэг, затем с помощью GetTagData (см. выше) получать все остальное. |
Автор: klem4 20.3.2009, 17:31 | ||
Вам нужно построить деревто чтоли ? Лучьше рекурсивную функцию написать мне кажется чем пытаться регуляркой это сделать. Что вы хотите получить регуляркой от такого xml:
? |
Автор: KSURi 20.3.2009, 17:57 |
AndreyCH, да, вы выбрали неверный метод для изучения регексов |
Автор: AndreyCH 20.3.2009, 19:36 | ||||
Народ, ну что вы в самом деле! ;-) ![]() ![]() Поясню. На первом проходе обработается только один тэг <user_list> (он и является единственным элементом массива)во втором проходе обработаем уже только
соответсвенно все что внутри <user> добавляем в первый элемент нового массива, все что внутри <list> второй и так далее обрабатываем внутрь. Теперь перефразирую вопрос.
где $tag - это собственно и есть название тэга. вот как мне написать регулярное выражение чтобы до этой операции находилось название тэга... А уж потом сделолсь тоже что и в приведенном примере. И все это внутри одного регэкспа. PS а вот тут уже можно и регэкспам поучиться. ![]() |
Автор: KSURi 20.3.2009, 20:03 | ||||
В $2 окажутся данные из тэга Добавлено через 1 минуту и 54 секунды
|
Автор: AndreyCH 20.3.2009, 22:32 | ||||||||
Ну и умучился я!!! Помощи и разъяснения душа просит!!! ![]() итак. xml файли остался прежним - (смотри пред ответ)
и$data1 и$data2 undef и я код так мучил и по-другому и вот до чего дошел если меняем регулярку на
на выходе имеем $data1 = "user_list" как и должно быть. ![]() теперь меняем на
и оппа! $data1 = "id" (это-то откуда взялось!!!) $data2 = "3" (еще одно "чудо в решете") Народ ну объясните что за... ? ![]() Ну и наконец как толко беру исходное -
В чем же тут дело? |
Автор: amg 21.3.2009, 10:08 |
AndreyCH, для начала замените исходную регулярку на логичную для Вашего случая /<(.+?)>(.+?)<\/\1>/s и с ней уже экспериментируйте Строка то у Вас многострочная (поэтому нужен модификатор /s), и в закрывающем тэге есть слеш. |
Автор: SkoobyDoo 21.3.2009, 13:31 | ||||||
AndreyCH,
регексп поменяйте на
|