I figured it out.

Turns out that my "pretty" structure of XML formating within the xml file
shot me.

everytime i indented a new tag i intoduced a \tab character, and apparently
everything not within any tag is also #PCDATA?! i never seen this mentioned
anywhere.

oh well; i am just posting an answer in case smone else down the road
encounters that same problem.

alex


Alex Maslov wrote:

> Hi,
>
> i have a question about how PHP XML support works, in particular how
> handler methods are called.
>
> if i have element-only tag, like:
>     <host>
>             <name>foo</name>
>             <location>usa</location>
>     </host>
>
> and i invoke xml parser on this, should my registered pcDataHandler
> method be called when tag <host> is being parsed, or parser is "smart"
> enough not too, becasue their is no #PCDATA in the <host> tag?
>
> I have smth like that going on, my pcDataHandler function is beeing
> called 2 times too many, and on every single tag(even the one's with no
> #PCDATA in them).
>
> I have a feeling a have a gross mistake smwhere, but i can't find it.
> please help. and sorry for longwinded message.
>
> this is the snap-shot of my XML data file:
>        <section publish="true" release_host_info="false"
> updated="213237827347">
>                 <section_name>General Information</section_name>
>                 <host>
>                         <first_name>Janine</first_name>
>                         <middle_name>Nadia</middle_name>
>                         <last_name>Mohammed</last_name>
>                         <email>[EMAIL PROTECTED]</email>
>                 </host>
>                 ...
>         </section>
>
> and this is the correcponding DTD shiplet:
>
>         <!ELEMENT section (section_name, host, question*)>
>                 <!ATTLIST section
>                         publish (true|false) "true"
>                         release_host_info (true|false) "false"
>                         updated CDATA #REQUIRED
>                 >
>                 <!ELEMENT section_name (#PCDATA)>
>                 <!ELEMENT host (first_name, middle_name?, last_name,
> email)>         <!-- defined earlier in the DTD -->
>                 <!ELEMENT question (from, content, answer*)>
>                         <!ATTLIST question
>                                 id ID #REQUIRED
>                                 publish_poster_info (yes|no|anonymous)
> "yes"
>                                 post_date CDATA #REQUIRED
>                         >
>                         <!ELEMENT from (first_name, middle_name?,
> last_name, email)>
>                         <!ELEMENT content (#PCDATA)>
>                         <!ELEMENT answer (#PCDATA)>
>                                 <!ATTLIST answer
>                                         posted CDATA #REQUIRED
>                                 >
>
> this is the sniplet of debug output (code follows):
>
> before assigment currentTag = section_name - after assigment currentTag
> = host
>     pcdata =         <!--MY COMMENT: should pcDataHandler called on host
> tag, it doesn't have any PCDATA?! -->
>     pcdata =
> before assigment currentTag = host - after assigment currentTag =
> first_name
>     pcdata = Janine
> end of tag = first_name
>     pcdata =         <!--MY COMMENT: why pcDataHandler is beeing called
> extra 2 times on this tag?! -->
>     pcdata =
> before assigment currentTag = first_name - after assigment currentTag =
> middle_name
>     pcdata = Nadia
> end of tag = middle_name
>     pcdata =
>     pcdata =
> before assigment currentTag = middle_name - after assigment currentTag =
> last_name
>     pcdata = Mohammed
> end of tag = last_name
>     pcdata =
>     pcdata =
> before assigment currentTag = last_name - after assigment currentTag =
> email
>     pcdata = [EMAIL PROTECTED]
> end of tag = email
>     pcdata =
>     pcdata =
> end of tag = host
>     pcdata =
>     pcdata =
>     pcdata =
> ...
>
> the parser code:
> <?php
>
> class faqHandler {
>
>  var $parser;    //xml parser
>  var $file;
>  var $currentTag;
>
>  var $ATTRIBS = array();
>  var $FAQ_HEAD = array();
>
>  function faqHandler($file="faq.xml", $fold="false") {
>   $this->file = $file;
>
>   $this->parser = xml_parser_create();
>   //xml_set_object($this->parser, &$this);
>   xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, $fold);
>   xml_set_element_handler($this->parser, "startTagHandler",
> "endTagHandler");
>   xml_set_character_data_handler($this->parser, "pcDataHandler");
>  }
>
>  function parseNow() {
>   xml_set_object($this->parser, &$this);
>
>   if ( ! ($fd = fopen($this->file, "r")) ) {
>    die(sprintf("Could not open xml file %s", $this->file));
>   }
>
>   while ( ($rawxml = fread($fd, 4096)) ) {
>    if ( !(xml_parse($this->parser, $rawxml, feof($fd))) ) {
>     die(sprintf("<font color=\"#FF0000\" size=\"+3\">XML error in file
> %s at line%d possition %d</font>",
>      $this->file,
>      xml_get_current_line_number($this->parser),
>      xml_get_current_column_number($this->parser) ));
>    }//eo if
>   }//ei while
>  }
>
>  function clean() {
>   xml_parser_free($this->parser);
>  }
>
>  function getTagContent($tag_name) {
>
>  }
>
>  function startTagHandler($parser, $name, $attrib) {
>   echo("before assigment currentTag = $this->currentTag - ");
>   $this->currentTag = $name;
>   echo("after assigment currentTag = $this->currentTag <br>");
>
>   switch(strtolower($name)) {
>    case "faq" : {
>     $this->ATTRIBS["faq_version"] = $attrib["version"];
>     $this->ATTRIBS["faq_revised"] = $attrib["revised"];
>     break;
>    }
>    case "faq_head" : {
>     break;
>    }
>    case "zip" : {
>     $this->ATTRIBS["zip_location"] = $attrib["location"];
>     break;
>    }
>    case "phone" : {
>     $this->ATTRIBS["fone_area"] = $attrib["area"];
>     $this->ATTRIBS["fone_ext"] = $attrib["ext"];
>     break;
>    }
>    case "fax" : {
>     $this->ATTRIBS["fax_area"] = $attrib["area"];
>     $this->ATTRIBS["fax_ext"] = $attrib["ext"];
>     break;
>    }
>   }//eo switch
>
>  }
>
>  function pcDataHandler($parser, $pcdata) {
>   echo("pcdata = $pcdata <br>");
>   //echo("inside pcDataHandler: currentTag = $this->currentTag && pcData
> = $pcdata <br>");
>   //echo("current errorString value = " .
> xml_error_string(xml_get_error_code($this->parser)) ."<br>" );
>
>   switch(strtolower($this->currentTag)) {
>    case "firm_name" : {
>     $this->FAQ_HEAD["firm_name"] = $pcdata;
>     //echo("pcdata = $pcdata");
>     break;
>    }
>    case "firm_location" : {
>     $this->FAQ_HEAD["firm_location"] = $pcdata;
>     break;
>    }
>   }//eo switch
>
>  }
>
>  function endTagHandler($parser, $name) {
>   echo("end of tag = $name <br>");
>  }
>
>  function cleanVars() {
>
>  }
>
>  function printFaqHeader() {
>
>   echo("<br>");
>   echo($this->FAQ_HEAD["firm_name"]); echo("did u get it?");
>
>   echo("<br>");
>   echo($this->ATTRIBS["faq_version"]);
>
>   echo("<br>");
>   echo($this->ATTRIBS["faq_revised"]);
>
>   echo("<br>");
>   echo($this->ATTRIBS["zip_location"]);
>
>   echo("<br>");
>   echo($this->ATTRIBS["fone_area"]);
>
>   echo("<br>");
>   echo($this->ATTRIBS["fone_ext"]);
>
>   echo("<br>");
>   echo($this->ATTRIBS["fax_area"]);
>
>   echo("<br>");
>   echo($this->ATTRIBS["fax_ext"]);
>  }
>
> }//eo class faqHandler
>
> ?>
>
> the faq.php code which intantiates the parser and calls the print
> method:
> <?php
>  require_once $FULL_PATH.$INCLUDE.$FAQ_XML_LIB;
>
>  $faq = new faqHandler("faq.xml", false);
>  $faq->parseNow();
> // $faq->clean();
>
>  $faq->printFaqHeader();
> ?>
>
> Thanks for your help,
>
> alex


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

Reply via email to