[php/xml]functie niet aaroepbaar in method

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 16-09 06:34
Ik ben dus bezig om via SAX een XML parser te fabriceren in PHP

Nu heb ik een class gemaakt en die geef je een XML file en 2 arrays met start & endtags. In de class zitten wat methods die de goede html bij de tags zoekt.

Wat is dan het probleem zou je zeggen ;)
Nou in de hoofd-method zeg maar, wordt de XML file geopend en wordt een handler aangemaakt. Het probleem is nu alleen dat ik een error krijg als ik de data wil gaan lezen...

code:
1
Warning: Unable to call handler () in f:\zuccio\devzone\test\saxxmlparser.php on line 101

Dat is hier dus regel 18..
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
        $xmlparser = xml_parser_create();

        // set handlers and options for white space processing
        xml_set_element_handler($xmlparser, $this->startElementHandler, $this->endElementHandler);
        xml_set_character_data_handler($xmlparser, $this->dataHandler);
        xml_parser_set_option($xmlparser, XML_OPTION_SKIP_WHITE, $_xml_option_skip_white);

        if(!$this->isParsebleFile()) {
            $this->xml_errors[] = "XML file '".$this->xmlfile."' could not be found or processed";
        }else{
            
            if(!$fp = fopen($this->xmlfile, "r")) {
                $this->xml_errors[] = "XML file '".$this->xmlfile."' could not be opened for processing";
            }else{

                while($data = fread($fp, 4096)) {
                    //xmparser, data en fp bestaan hier wél
                    if(!xml_parse($xmlparser, $data, feof($fp))) {
                        $this->xml_errors[] = "XML file error in file '".$this->xmlfile."'";
                    }
                }
                xml_parser_free($xmlparser);

Hij kan een of andere handler functie niet aanroepen. De gegevens die voor "xml_parse()" nodig zijn, zijn er wel :S

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Moet je niet iets met xml_set_object() doen? Dat wil zeggen, als jij je handlers in je class hebt staan, moet je dat met deze functie aangeven, anders gaat ie die functies in de global scope zoeken.

Rustacean


Acties:
  • 0 Henk 'm!

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 16-09 06:34
Oh dat ga ik eens ff proberen. Als ik het niet in een class doe maar gewoon via functions werkt ie namelijk weer wél (das alleen niet de bedoeling)

Maar waarom zou je dan nu iets met xml_set_object() moeten doen? je roept toch gewoon xml_parse() aan :S

Hmm het maakt niet uit. Ik heb hem erin gezet en gelijk nog even het commentaar gelezen op php.net en opgevolgd maar het blijft hetzelfde :S

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
Mmmm, misschien een beetje offtopic, maar als ik een beetje begrijp wat je hier aan het bouwen bent, lijkt het ontzettend veel op de PEAR XML_Transformer class,
zie pear.php.net en XML_Transformer
Misschien dat het je een hoop werk kan besparen

Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

TheRebell schreef op 25 April 2003 @ 01:20:
Oh dat ga ik eens ff proberen. Als ik het niet in een class doe maar gewoon via functions werkt ie namelijk weer wél (das alleen niet de bedoeling)

Maar waarom zou je dan nu iets met xml_set_object() moeten doen? je roept toch gewoon xml_parse() aan :S

Hmm het maakt niet uit. Ik heb hem erin gezet en gelijk nog even het commentaar gelezen op php.net en opgevolgd maar het blijft hetzelfde :S
Weet je zeker dat je het goed doet? Volgens beschrijf je namelijk wel precies het probleem dat xml_set_object() oplost. Je moet deze dus gebruiken zoals hieronder staat, en dan wel VOOR je je element handlers registreert:

PHP:
1
xml_set_object($this->parser, &$this);

Rustacean


Acties:
  • 0 Henk 'm!

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 16-09 06:34
Heb ik gedaan, krijg je zoiets

PHP:
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
        // create XML parser
        $this->xmlparser = xml_parser_create();

        // set object parser
        xml_set_object($this->xmlparser, &$this);

        // set handlers and options for white space processing
        xml_set_element_handler($this->xmlparser, $this->startElementHandler, $this->endElementHandler);
        xml_set_character_data_handler($this->xmlparser, $this->dataHandler);
        xml_set_notation_decl_handler($this->xmlparser, $this->notationHandler);
        xml_set_processing_instruction_handler($this->xmlparser, $this->piHandler);
        xml_parser_set_option($this->xmlparser, XML_OPTION_SKIP_WHITE, $_xml_option_skip_white);

        if(!$this->isParsebleFile()) {
            $this->xml_errors[] = "XML file '".$this->xmlfile."' could not be found or processed";
        }else{
            
            if(!$fp = fopen($this->xmlfile, "r")) {
                $this->xml_errors[] = "XML file '".$this->xmlfile."' could not be opened for processing";
            }else{

                while($data = fread($fp, 4096)) {
                    //xmparser, data en fp bestaan hier wél
                    if(!xml_parse($this->xmlparser, $data, feof($fp))) {
                        $this->xml_errors[] = "XML file error in file '".$this->xmlfile."'";
                    }
                }
                xml_parser_free($xmlparser);

Maar hij blijft het zeggen :S

beetle71 ik schrijf het liever zelf, beetje mee klooien enzo leer je meer van dan een bestaand iets gebruiken..
Btw:
code:
1
2
3
With the XML/Transformer class one can easily bind PHP
functionality to XML tags, thus transforming the input XML tree
into an output XML tree without the need for XSLT

Die heeft als input & output XML en dat is, voor mij, niet de bedoeling...

Als ik kijk naar de stukken code van php.net dan klopt de manier wel zoals ik het nu doe maar toch werkt het niet...

[ Voor 16% gewijzigd door TheRebell op 25-04-2003 10:58 ]


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Zet eens ergens de hele file als .phps online.

Rustacean


Acties:
  • 0 Henk 'm!

  • TheRebell
  • Registratie: Oktober 2000
  • Laatst online: 16-09 06:34
bah, ook php.net is niks..... na wat zoeken op andere php sites weet ik helaas nog niks..
Volgens php.net zou je het op deze manier moeten doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
class xml  {
    var $parser;

    function xml()
    {
        $this->parser = xml_parser_create();

        xml_set_object($this->parser, &$this);
        xml_set_element_handler($this->parser, "tag_open", "tag_close");
        xml_set_character_data_handler($this->parser, "cdata");
    }

Maar dat wordt weer verbeterd door een post van iemand die zegt dat ie wat settings verliest als je hem niet in de constructor zou aanroepen.
Nu heb ik dit even in mn constructor gezet:

PHP:
1
2
$this->xmlparser = xml_parser_create();
xml_set_object($this->xmlparser, &$this);

Maar dat maakt niets uit. Hij blijft z**ken over die "handler()" die die niet kan aanroepen. Maar wat voor/welke handler is dat doen :S slaat dat op xml_parse() want als ik die ergens anders zet (zonder argumenen erin) zegt ie toch duidelijk dat ie wat argumenten ervan mist dus hij "ziet" hem wel....

dit is de file SaxXmlParser

[ Voor 9% gewijzigd door TheRebell op 25-04-2003 15:56 ]

Pagina: 1