Самописный XML парсер на PHP4, ваше мнение

Ponemetski

Новичок
Самописный XML парсер на PHP4, ваше мнение

Написал XML парсер, который не зависит от установленных расширений. Работает в PHP4 и легко адаптируется под PHP5.

Хочу узнать ваше мнение относительно самой идеи, ее реализации и возможности использования.

Описание модуля:

- КЛАСС ДЛЯ РАБОТЫ С ТЕГОМ ( myxmlTeg )
- КЛАСС ДЛЯ РАБОТЫ С ЭЛЕМЕНТАМИ(НОДАМИ) ( myxmlElem )
- КЛАСС ДЛЯ ПАБОТЫ С ДОКУМЕНТОМ ( myxmlDoc )
- ФУНКЦИИ ДЛЯ СОЗДАНИЯ ДОКУМЕНТА ( myxmlFromFile, myxmlFromStr, myxmlEmpty )

класс для работы с тегом
свойства:
name -- имя тега
type -- тип тега: принимает три значения:
'c'-закрывающий(</form>)
's'-одиночный(<br/>)
'd'-двойной(<p>...</p>)
Не следует пользоваться во внешнем коде, для изменения используйте
функции из класса myxmlElem: setText, addChild, deleteAllChilds
attributes -- массив содержащий атрибуты тега и их имена
attribytes[N]['name'] -- имя атрибута N
attributes[N]['value'] -- значение атрибута N
Не следует пользоваться во внешнем коде, для изменения используйте
функции этого класса
методы:
myxmlTeg(s) -- конструктор, s - корректная строка-тег '<bla-bla... >'
параметры-флаги тега не учитываются, следует также
использовать только двойные кавычки (")
Например: <br w="100" h='200' r=90 noshade/>
будет распознан только параметр w.
getAttributeValue(id) -- возвращает НЕ безопастную для html строку-значение
атрубута или false, если такого атрибута нет,
id - номер атрибута или его имя
getAttributeValueForHtml(id) -- возвращает БЕЗОПАСТНУЮ для html строку-значение атрубута
идентична htmlspecialchars(getAttributeValue(id))
setAttributeValue(id,value) -- изменяет значение атрибута, вернет false, если такого
атрибута нет или true если изменение удалость
value - НЕ безопастная для html строка
id - номер атрибута или его имя
addAttribute(name,value) -- добавление нового атрибута, name - имя, value - значение
Не проверяет существование параметра name, перед
добавлением, это может вызвать появление нескольких
параметров с одинаковыми именами. Используйте
deleteAttribute до вызова, чтобы решить эту проблему.
deleteAttribute(id) -- удаление атрибута, если он есть, если его нет ничего
не произойдет, id - номер атрибута или его имя
deleteAllAttributes() -- удалить все ватрибуты тега
asString() -- возвращает тег как строку


класс для работы с документом
свойства:
history -- перпеменная-строка используется при рекурсивном создании элемента,
после корректного создания она принимает значение '', но НЕ является
гарантией корректного создания, есстественно не следует ее использовать
parent -- ссылка на родительский элемент
istext -- текстовый ли это элемент (true) или нет (false)
text -- если элемент текстовый то здесь текст, не следует пользоваться во внешнем
коде, используйте функции getText, getTextForHtml, setText
teg -- ссылка тег данного элемента, объект типа myxmlTeg
childs -- массив дочерних элементов
методы:
myxmlElem(s,parent) -- конструктор, создает элемент рекурсивно, не следует использовать
во внешнем коде, вместо этого воспользуйтесь методом addChild
родителя,
s - корректная строка элемент, parent - родитель нового элемента
getText() -- возвращает НЕ безопастную для html строку которая содержиться
в переменной text на данный момент
getTextForHtml() -- возвращает БЕЗОПАСТНУЮ для html строку
идентична вызову htmlspecialchars(getText())
setText(text) -- делает элемент текстовым, удаляет всех его детей, ставит istext
в положение true, присваивает text text
text - НЕ безопастная для html строка если text - пустая строка
то тег элемента будет преобразован в одиночный,
именно поэтому не следует вручную изменять переменную text
getChild(id) -- возвращает копию или копии элементов, если id - номер
возвращает копию элемента ребенка под номером id, если
id - строка вернет массив с копиями элементов детей, имена тегов
которых совпадают с id, основной недостаток, именно возврат копий
ведь не имеет смысла редактировать свойства копии, так что
функция реально полезна только когда нужно причитать какое-то
свойство у всех элементов с известным именем
addChild(child) -- добавляет дочерний элемент
если child - объект то добавляет его, не проверяет корректность,
если строка то парсит и добавляет полученный объект, вернет
номер нового элемента в списке элементов родителя
d->addChild(str) и d->childs[] = &new myxnlElem(str,d)
эквивалентны, однако следует использовать первый вариант
deleteChild(n) -- удалить дочерний элемент с номером n, если элемент не
текстовый и это был последий дочерний преобразует тег
элемента в одиночный
deleteAllChilds() -- удаляем все дочерние элементы, если элемент не текстовый
преобразует тег элемента в одиночный
asString(level) -- возвращает элемент как строку с отступом level*' '
по умолчанию level равен нулю


класс для работы с документом
свойства:
doctype -- тип документа, должен быть примерно таким '<?xml...?>'
doc -- первый родительский элемент класса myxmlElem
методы:
myxmlDoc(s) -- конструктор, создает документ из корректной сторки s, doctype
может отсутствовать, не следует использовать во внешнем коде,
пользуйтесь функциями myxmlFromFile, myxmlFromStr и myxmlEmpty
КОРРЕКТНОСТЬ:
каждый элемент может быть
либо текстовым, содержащим только текст '<p>some text</p>',
либо одиночным <.../>
либо с потомками тегами
<p>
<b>...</b>
<c>...</c>
</p>

это значит что следующий документ - НЕ корректен
<b>
hello world!
<i>some info</i>
</b>

атрибуты тегов должны содержать имя, значение, причем значение
может быть заключено только в двойные кавычки (")
вот так: имя="значение" и никак иначе

при анализе:
<t h="22" w='13' col=red shadow />
будет распознан только первый параметр

основной (первый) элемент должен быть один, то есть докумнты
<?xml version="1.0"?>
<base1>
...
</base1>
<base2>
...
</base2>
являются НЕ корректными

документы с комментариями тоже считаются НЕ корректныыми
это поведение будет исправлено в будущем

ПРИ ОБРАБОТКЕ НЕ КОРРЕКТНЫХ ДОКУМЕНТОВ ДЕЙСТВИЯ МОДУЛЯ
НЕПРЕДСКАЗУЕМЫ И СКОРЕЕ СЕГО ЗАКОНЦАТСЯ ЗАЦИКЛИВАНИЕМ

asString() -- возвращает документ как строку
saveToFile(path) -- сохраняет документ по адресу path вернет false если не удалость
записать в файл (нужно переработать про unix системы)

Необходимые "внеклассовые" функции
doc-obj myxmlFromFile(path) -- читаем документ из файла, вернет false если файла нет
или он не читается иначе вернет объект-документ
doc-obj myxmlFromStr(str) -- читаем документ из сторки, документ должен быть!
минимально что-то вроде этого: '<z></z>' для создания
пустого используйте функцию myxmlEmpty() возвращет
объект-документ возможно в будщем функция будет
возвращать сведения об ошибке парсинга
doc-obj myxmlEmpty(str) -- создает пустой докумет и возвращает его, идентична
вызову myxmlFromStr("<$str></$str>"), по умолчанию
str равен 'doc'

Полный текст скрипта:
http://chyvak.fatal.ru/downloads/mod_myxml.txt

-~{}~ 13.04.06 15:18:

Извините за большое кол-во текста, если кто хочет почитать, щелкайте сразу по ссылке, там по крайней мере с отступами.
 

crocodile2u

http://vbolshov.org.ru
Имхо - бесперспективняк.

Ибо время, когда php4 станет атавизмом - не за горами. А в 5-ке есть средства, которые достаточно хороши для работы с XML.

Если же рассматривать такую поделку просто как скрипт, написанный для обучения... сошло бы - но! Есть же стандарты... Есть DOM. Почему бы этими стандартами, которые знакомы (или должны быть знакомы) всем, кто работает с XML - не воспользоваться?

ЗЫ: я даже не смотрел реализацию - основывался просто на сообщении.
 

ViJu

Новичок
Меня всегда радует когда я вижу подобные труды, во-первых то, что не перевелись на руси умелые программеры, во-вторых ...
если единственной причиной написания своего парсера является то, что не до конца понял, не смотрел что сделано по теме, зачем силы тратить то

"крут" конечно, но неправ - так программить нельзя
 
Сверху