Welcome, Guest. Please login or register.

Login with username, password and session length

 
Advanced search

3 877 Posts in 868 Topics- by 723 Members - Latest Member: tablarock

23 May 2012, 14:29
Select Language English | Russian ru | German
Main PageIRC Client KVIrc forumRussian talksСкриптингОбъектно-ориентированный скриптингКак работать с классом xmlreader?
Pages: [1]
Print
Author Topic: Как работать с классом xmlreader?  (Read 5623 times)
0 Members and 2 Guests are viewing this topic.
kns
Постоялец
***

Репутация: 38
Gender: Male
Posts: 223


View Profile WWW
« on: 12 May 2009, 15:31 »

Абсолютно ничего не понимаю в объекстах.
Дайте, пожалуйста, пример работы с этим классом.

Все, на что меня хватило - 2 строчки из мануала:
Code:
%x = $new(xmlreader)
%x->$parse($file.read($2))
Вторая строка возвращает 1. А вот как потом из распарсенного xml вытащить нужные теги (точнее их содержимое)?
« Last Edit: 12 May 2009, 15:34 by kns » Logged
Maximusya
Глобальный модератор
*****

Репутация: 49
Gender: Male
Posts: 343



View Profile
« Reply #1 on: 12 May 2009, 23:48 »

Класс-наследник можно создавать универсальный (но обычно получаются монстры, которые медленно работают), а можно сделать класс под конкретную задачу - то есть под конкретный xml.

Вот, создаем класс-наследник. Переопределяем метод parse (родительский метод будет вызываться внутри).
Вверху в комментариях написан ожидаемый xml.

Code:
/*
<stationlist>
<st>
    <n>/101erotic</n>
    <t>101.ru: Erotic</t>
    <d>Unspecified description</d>
    <ct>audio/mpeg</ct>
    <b>0</b>
    <s>THORNTON, Phil - The Healing Circle  18:12</s>
    <g>N/A</g>
    <l>6</l>
  </st>
 <st>
 ...
 </st>
</stationlist> */

class("BUFLICK::xml2ds","xmlreader")
{

function parse()
{
if ($0 == "")
{
debug "[xml2ds::parse] The name of the file to parse was not specified"
return $false
}
if (!$file.exists($0))
{
debug "[xml2ds::parse] The file to parse was not found"
return $false
}

if(!$$->$xmlreader::parse($file.read($0)))
{
debug "[xml2ds::parse] Critical error: $$->$xmlreader::lastError()"
return $false;
}
else
{
return @%stations
}
}

internal function onDocumentStart()
{
//debug "Document Start"
@%stations = $array();
@%currentindex = 0;
return $true;
}

internal function onDocumentEnd()
{
//debug "Document End"
return $true;
}

internal function onElementStart()
{
//debug <$0>
if ($0 == stationlist) return $true
if ($0 != st)
{
@%currentkey = $0
}

return $true;
}


internal function onElementEnd()
{
//debug </$0>
if ($0 == st) @%currentindex++
return $true;
}


function constructor()
{
}


internal function onWarning()
{
warning $0
return $true;
}

internal function onText()
{
//debug $0
%text = $0;
//Trim leading and trailing space characters
%text = $str.strip(%text)
if (%text)
{

if (@%currentkey == n)
{
%text =~ s/^\///g
}
//debug @%currentindex : \"%text\"
@%stations[@%currentindex]{@%currentkey} = %text

}
return $true;
}
}

Использование:
Code:
%xml = $new(BUFLICK::xml2ds);
%stationsArr = %xml->$parse("C:\\buflick_temp_l.xml")

if (!%stationsArr)
{
debug "[BUFLICK::parseXMl] Error while parsing xml-file $0"
return
}

Для понимания, что происходит, можешь раскомментировать множественные debug операторы.
« Last Edit: 12 May 2009, 23:50 by Maximusya » Logged
kns
Постоялец
***

Репутация: 38
Gender: Male
Posts: 223


View Profile WWW
« Reply #2 on: 13 May 2009, 14:52 »

Спасибо!
Logged
Pages: [1]
Print
Jump to:  

Theme orange-lt created by panic