Автор Тема: Парсинг XML + много других вопросов.  (Прочитано 9130 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Hi!
Задача такенная: нужно парсить XML. По идее, можно обойтись без модулей, скрипт-то всего на строк десять. Но уперся в большие глюки, руки, видимо, на NFS чуть покривил. Об джойстик. ;)

Есть типа XML:

   NaME
   BODY
   Боди
текста.

   
      AUTORNAME
      MAIL
   

   
      22.11.2003
      22.11.2004
   



Хотя text, autor и date не нужны совсем, незачем делать вложенность.

Теперь проблемы:
1. Прочитать надо бы из файла. Никак не получается прочитать в одну строчку, убрав \\n.
Пробовал так:

open(XML,"xml.xml");
   @XML = ;
close(XML);
foreach(@XML){
   $res = $res . chomp($_);
}

Какая-то ерунда получается. Подскажите плиз правильный способ привода этого XML в одну строку.

2. Вытаскивание значений тегов. Или как правильно сказать? Нашел тут на форуме, чуть подправил под свои нужны. Работает.

@snames = ("textname","textbody");

foreach(@snames){
   if ($res =~ /<$_>(.+?)<\\/$_>.*/) {
      $t = $1;
      Обработка...
   };
};

Так нормально?

3. Можно ли найти все XML теги, которые используются в документе? То есть всё, что бывает между <> и забить в отдельный массив? Точнее, как? Наверное, тоже тройка строк.

Antilamer FAQ: книги по Perl у меня есть, что такое perldoc тоже знаю. Просто уже несколько часов что-то ничего не получается, плюс голова забита кучей других мыслей (Как понятно, пишу движок сайта. Готова только обработка cookie.). Времени очень мало. Пока остановился на этих проблемах, не могу писать (ударение ставьте как нравится) дальше.

WBR, GrAfF.
WBR, GrAfF.

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Парсинг XML + много других вопросов.
« Ответ #1 : 24 Января 2004, 21:26:40 »
Первую проблему решил, возникла новая. Текст в строчку собираю с помощью:
open(XML,"xml.xml");
@XML = ;
close(XML);
chomp(@XML);
$strr = "@XML"; # А вот иначе эту строку можно написать? Покрасивше?


Следующая: каждая строчка XML, конечно, отформатирована табами. В начале строки Как их можно удалить? Тоже, вот, наверное, одной строкой делается... Плиз хэлп.
WBR, GrAfF.

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Парсинг XML + много других вопросов.
« Ответ #2 : 24 Января 2004, 22:17:57 »
2B OR NOT 2B = FF

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Парсинг XML + много других вопросов.
« Ответ #3 : 24 Января 2004, 22:49:42 »
Сhs, спасибо. Наверное, в форум нужно бота дописать, который по ключевым словам сообщения будет отвечать про perldoc? :) А за join спасибо, что-то я про него не догадался вспомнить.

Так же гораздо интереснее: написать что-то самому. Я читал про XML, скачал книгу ОуРилли? ;) на эту тему. Сегодня оказалось, что для моих нужд требуется скрипт из всего лишь семнадцати строк...

Табы и пробелы после склейки массива в строку удаляются через:
$strr =~ s/\\t//g;
$strr =~ s/> />/g;
Ничего, нормально?

Теперь более сложный вопрос. Как можно посчитать количество одинаковых XML тегов и как вынуть содержимое, наример, именно третьего?
test1test2 и тд...

P.S. Забавно, как я тут сам с собой решаю проблемы. Надеюсь, хоть будующим читателям поможет, которым как обычно "рулит поиск". ;)
WBR, GrAfF.

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Парсинг XML + много других вопросов.
« Ответ #4 : 25 Января 2004, 00:45:07 »
Цитировать
test1test2 и тд...

В такой постановке задачи все теги различны.:)
Цитировать
Так же гораздо интереснее: написать что-то самому.

Изобретение велосипеда не преследуется по закону.:)
2B OR NOT 2B = FF

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Парсинг XML + много других вопросов.
« Ответ #5 : 25 Января 2004, 02:38:57 »
Chs, вообще замучался немного. Если теги уникальны, т.е. каждый тег встречается не более раза, нужное значение можно вытащить регулярным. Зато при повторе тегов ничего лучше, чем приплюсовать поиск по подстроке, мне в голову не пришло. Но IMHO это совсем не красиво. Много кода и лишних действий.

Предположим, код:
text1text2
или же с закрытием через .

Ладно, спрошу сразу точно.
1. Ищем "2. Используем регулярный код из моих сообщений выше, подставляем в строку номер нужного повторяющегося тега, получаем кусок с уникальными тегами, которые тем же почти кодом нормально парсятся.
Красиво? ;)
IMHO не совсем.

Велосипеда не преследуется. А Кольт сделал людей равными. ;)
WBR, GrAfF.

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Парсинг XML + много других вопросов.
« Ответ #6 : 25 Января 2004, 13:28:40 »
@snames = ("textname","textbody");

foreach(@snames){
while ($res =~ /<$_>(.+?)<\\/$_>/g) {
$t = $1;
Обработка...
};
};

Так?
2B OR NOT 2B = FF

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Парсинг XML + много других вопросов.
« Ответ #7 : 25 Января 2004, 18:51:57 »
Chs, огномные спасибы за while!!!
Наверное, последний вопрос.
Можно ли заменить код
while ($res =~ /<$_>(.+?)<\\/$_>/g) {
на ловящий следующие варианты (вытаскиваемые части отмечены жирным):
name="value">in tag
и
name="value"/>
То есть в первом варинате name="value" - одна строка, вплоть до первой >, in tag - другая строка, при этом любая строка может отсутствовать. При этом так как выше tag передаётся переменной.

Во втором вариатне ловится только строка параметров тега, до />.

В идеале, задумывается, что этот код должен выдирать и обрабатывать определенные теги xml, не завися от их полности.
« Последнее редактирование: 25 Января 2004, 19:06:10 от GrAfF »
WBR, GrAfF.

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Парсинг XML + много других вопросов.
« Ответ #8 : 25 Января 2004, 20:32:08 »
Chs, попробовал сам сделать (смешно, да? ;).

$strr = \'in tag1in tag3\';

#in tag1
#
#in tag3
#
#
#

@snames = ("tag");

foreach(@snames){
#   while ($strr =~ /<$_(.*?)>(.*?)<\\/$_>/g) { #работает
#   while ($strr =~ /<$_([^>]*?) \\/>/g) { #работает
      $t = $1;
      $u = $2;
      $t =~ s/ //;
      print ("\\n" . "TAGPARAMS:" . "$t" . " TAGCONTENT:" . "$u");
   };
};

Сами по себе закомментированные while работают, обрабатывают "свои" теги. Как их склеить вместе? Я пробовал, но что-то никак.
WBR, GrAfF.

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Парсинг XML + много других вопросов.
« Ответ #9 : 26 Января 2004, 13:07:17 »
Help, товарищи! Остался последний рубеж - склеить два рега в один, либо ещё как-то что-то сделать. И в форуме останется неплохая ветка про парсинг XML.
WBR, GrAfF.

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Парсинг XML + много других вопросов.
« Ответ #10 : 28 Января 2004, 02:27:40 »
Так бы и сказали - не знаем, здаёмсу. Решил я эту проблему, только совсем не так, как предполагал. Сначала определяется тип тега, потом уже разбирается.
Всем читавшим спасибы.
WBR, GrAfF.

Оффлайн alm

  • Фанат форума
  • Постоялец
  • ***
  • Сообщений: 102
  • +0/-0
  • 0
    • Просмотр профиля
    • http://ispserver.com
Парсинг XML + много других вопросов.
« Ответ #11 : 30 Января 2004, 10:00:51 »
Ну ты маньяк. А если завтра на чуток формат файла поменяется??? Ты весь этот геморой будешь заново сочинять?

Есть либы для парсинга XML ими пользоваться и проще и приятней. Один раз разберешься, с разбегу не получится, функций много. Но зато потом разбор любого XML пишется за пару минут.

Лично я юзаю XML::LibXML
Алексей Чекушкин
менеджер проекта  - решения для хостинг компаний. менеджер проекта  - хостинг на Виртуальных Выделенных серверах (VDS / VPS). консультант проекта  - хостинг на Виртуальных Выделенных серверах (VDS / VPS) от 4.9

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Парсинг XML + много других вопросов.
« Ответ #12 : 30 Января 2004, 11:01:12 »
alm, ну была у меня мечта такая - XML парсить. Самому придумывать код лень, а в чужих работах разбираться - лень ещё большая. Одна из них победила. ;)

Теперь серьёзно. Была проблема хранения текстов и сопутствующей информации в файлах, так, чтобы можно было легко это всё оттуда вытащить. Написал примитивный парсер. То есть парсит, но ещё много чего придумать надо. Заодно разобрался в регулярных выражениях.

Формат никуда не поменяется, т.к. все теги пишу сам. ;)

Самое неприятное - бить тексты на страницы, встравлять в шаблоны, прописывать все ссылки. Вручную. Много ошибок, времени уходит. Поэтому если можно автоматизировать - то так, чтобы потом туда не возвращаться. ;)

Да и просто приятно. ;)
WBR, GrAfF.

Оффлайн GrAfF

  • Завсегдатай
  • Пользователь
  • **
  • Сообщений: 59
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
Парсинг XML + много других вопросов.
« Ответ #13 : 02 Февраля 2004, 07:17:13 »
Плиз хэлп, новая проблема!
Есть содержимое файла:
con


(tab)tent


(tab)and
(tab)text


Можно ли пропарсить *, не удаляя \\n?, чтобы на выходе тоже было всё отформатировано?
WBR, GrAfF.

Оффлайн Chs

  • Perl программер
  • Глобальный модератор
  • Ветеран
  • *****
  • Сообщений: 1108
  • +0/-0
  • 2
    • Просмотр профиля
    • http://chs.now.at/
Парсинг XML + много других вопросов.
« Ответ #14 : 02 Февраля 2004, 10:00:47 »
Можно.
2B OR NOT 2B = FF

 

Sitemap 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28