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