Of course! Brilliant - why didn't I think of building my own parser from the
ground up? ;-)

Thanks though, this is definitely a starting point.

Thanks,
Yoed

-----Original Message-----
From: Curt Zirzow [mailto:[EMAIL PROTECTED] 
Sent: Tuesday, September 28, 2004 10:13 PM
To: [EMAIL PROTECTED]
Subject: Re: [PHP] Need some ideas


* Thus wrote Yoed Anis:
> Hi guys,
> 
>       OK I need some ideas.
> 
>       Somebody created the stupidest XML file I've ever seen. And of
course 
> they can't change it, and I *must* be able to read it. I'm all out of 
> brain power on thinking how to go about reading it. I typically use 
> simplexml to read xml and that's where my knowledge end.
> 
> Heres the problem:
> 
> <Catalog>
>  <Rate>
>   <RateCode>1</RateCode>
>   <RateCurrency>USD<RateCurrency>
>   <RateValue>123</RateValue>
>  </Rate>
>  <RateDescription>
>   <Desc>This is dumn</Desc>
>  </RateDescription>

I've seen worse :)


You'll have to set up a class that can keep track of the state of your xml
file:

class StupidCatalog {
  var $code = 0;
  var $current = 'USD';
  var $value = '';
  var $description = array();
}

class StupidCatalogParser {
  var $catalog;          // Collection of rates
  var $current_catalog;  // building this one
  var $state;            // tag we're working on

  function startElement($parser, $name, $attr) {

   $this->state = $name;
   switch($name) {
     case 'Rate':
       // start working on a new 
       $this->current_catalog = new StupidCatalog();
       break;

    //...
   }

  }

  function endElement($parser, $name) {
    if($name == 'Rate') {
      // reference is important.
      $this->catalog[] = &$this->current_catalog;
    }
  }

  function elementData($parser, $data) {
    switch ($this->state) {
      case 'RateDescription':
        // tricky...
        $this->current_catalog->{$this->state}[] = $data;
        break;

      case 'RateCode':  // passthrough
      case 'RateValue': // and the rest...
        // more tricky...
        $this->current_cataglog->{$this->state} = $data;
        break;
  }
}

Just create a new StupidCatalogParser() and assign the methods to the
appropriate call backs in http://php.net/xml

btw, the above is untested and only theory :)

HTH,

Curt
-- 
The above comments may offend you. flame at will.

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to