Домашен Perl XML парсер

Ако ще правите разбор на HTML или XML, тогава класът Perl, който ще разработим в тази статия, може да ви помогне по този въпрос.

Няма да зареждам тук защо трябва да ограбвате и анализирате. Нека се спрем на факта, че имаме текст, който много прилича на XML. И трябва да го анализираме бързо и компетентно.

Формулиране на проблема

Напишете клас, предназначен да изпълнява типични задачи, които възникват при синтактичен анализ на текстове, подобни на xml.

Защо говоря като xml? Е, ако някога сте се опитвали да анализирате текста на html страница, използвайки DOM методи, тогава вероятно сте се сблъскали с факта, че не всяка html страница е правилен DOM документ. Тривиален пример - незатворени тагове

Следователно е необходимо да се даде възможност за прехвърляне на желаното парче текст като скалар, в който ще се търсят необходимите парчета, с оглед на факта, че той все още трябва да изглежда като xml. Затова наричам този клас LlXMLParser (прилича на XML парсер).

Бъдещият клас трябва да може:

  • съберете всички тагове с дадено име
  • събира съдържанието на всички тагове с дадено име
  • събира стойности на атрибути с дадено име
  • събира всички атрибути на етикет с дадено име

Класове по „Perl

Изпълнение

Конструктор

Прост конструктор. Връща връзката "благословен" в пакета.

Режим за отстраняване на грешки

За да улесним отстраняването на грешки в класа и да го използваме по-късно, ще напишем метод, който ще активира и деактивира режима за отстраняване на грешки.

Режимът за отстраняване на грешки ще бъде да връща не само стойности, но такива, които са оптимизирани за показване и отстраняване на грешки. За целта ни е необходим метод, който преобразува обикновена част от xml в xml, подготвена за показване.

Функцията взема препратка към скалар и го модифицира.

Събиране на тагове

Този метод взема текст за синтактичен анализ и име на етикет. След това търси текста за дадения маркер. Предполага се, че това е етикет на контейнер. Ако това е единичен таг, тогава ще получим атрибутите му по различен начин.

Извличане на всички атрибути на етикет

Ако се интересуваме от това какви атрибути има етикетът, можем да използваме метода tag_atribs.

Вземете връзка към всички атрибути на маркери с даденото име.

Събиране на съдържание на тагове

Да кажем, че искаме да получим съдържанието на всички параграфи. Освен това, без самите параграфи. Можете да използвате метода tag_contents.

Събиране на стойностите на определен атрибут

Да кажем, че искаме да съберем всички връзки към снимки от страницата. Ще ни трябват стойностите за атрибута src. Ето метод за бързо извършване на това, което имаме предвид.

Всъщност ще получим връзка към масив от стойности на нашия атрибут.

Е, за лека закуска можете да оборудвате нашия клас с прост метод, който ще преброи колко пъти даден низ или регулярен израз се появява в текста.

Заключение

Разбира се, този клас е примитивен. Например, той не знае как да работи с вложени етикети. Например тя интерпретира неправилно конструкцията на вложени таблици. Но това е прост и удобен инструмент, който решава типични задачи за улавяне при анализиране на подобни на XML текстове.

Всъщност това дори не е клас, а библиотека. В края на краищата едва ли се нуждаем от повече от един обект от този клас поради факта, че не вшиваме текст в обект, но всеки път предаваме парче при извикване на методи. OOP е тук само за да се избегнат сблъсъци на имена. Освен това подобрява преносимостта на библиотеката.

Може би по-късно ще добавя методи за подрязване и изрязване на нещо. Също така би било хубаво да видите методи за намиране и замяна тук.

Има и задачи за почистване на кода. Например обща задача е да се премахнат всички атрибути (с изключение на важния тип src) във всички тагове.

Помислих същото за рекурсивното търсене на вложени тагове, но реших, че няма смисъл, защото изходният текст е точно като xml.

И ако искате да анализирате XML или сайтове професионално - можете да се свържете с мен и аз ще ви помогна с това. Може би дори безплатно;)