I’m using XML and PHP to make a “news” portion of a website… the xml looks like:
<news>
<id></id
<author></author>
<date></date>
<summary></summary>
<content></content>
</news>
it works for the most partm but the thing is that when I put some data in the <content></content> tags that consists of alot of text, the parser doesn’t work correctly…
here is my xml file:
<?xml version="1.0" encoding="iso-8859-1"?>
<news>
<story>
<id>1</id>
<title><![CDATA[hmmm...]]></title>
<author>Rob Carrillo</author>
<date>04/19/08</date>
<summary><![CDATA[Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent tortor neque, malesuada id, phare...]]></summary>
<content><![CDATA[Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent tortor neque, malesuada id, pharetra vitae, adipiscing at, ipsum. Sed accumsan dolor id velit. Etiam velit orci, tempor in, ultrices quis, pretium id, eros. Maecenas id lorem. Curabitur et elit sed lectus fermentum porta. Vestibulum odio urna, eleifend nec, fermentum a, vehicula eget, tortor. Vivamus in nisl sed odio egestas egestas. Donec consectetuer scelerisque leo. Maecenas ultricies risus nec enim. Maecenas malesuada lacus ut lacus. Vestibulum viverra, magna eget tincidunt posuere, leo magna facilisis urna, non consectetuer pede massa et orci.<br><br>Curabitur massa nunc, lobortis nec, imperdiet ac, pellentesque ac, risus. Aliquam erat volutpat. Morbi massa risus, rhoncus non, blandit ac, ultricies vel, sapien. Etiam neque pede, aliquet eu, molestie ac, scelerisque interdum, felis. Ut sodales. Proin purus. Maecenas mi dui, consequat vitae, gravida eget, pellentesque non, augue. Duis et leo. Nulla sit amet sem non dolor ullamcorper placerat. Nam blandit condimentum nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis ut ligula quis quam varius iaculis. Vivamus egestas, lacus vel aliquet molestie, ante sapien tincidunt eros, ultrices convallis mauris eros sed velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam consectetuer.<br><br>Donec convallis ligula at purus. Nunc id quam. Aliquam id augue. Cras ut magna ut metus convallis dictum. Praesent ipsum leo, laoreet ut, porta vel, semper nec, quam. Donec orci erat, convallis a, eleifend vitae, fringilla dignissim, nisi. Fusce rhoncus convallis justo. Pellentesque non nisl ut lacus lacinia dignissim. Etiam felis turpis, luctus quis, dapibus ac, pretium vel, tortor. Vivamus nec lacus. Mauris at pede vel libero vehicula pretium. Maecenas pede. Nulla facilisi. Aliquam tempus tortor ut tortor. Cras interdum enim eu arcu. Pellentesque gravida, turpis eu scelerisque posuere, leo tellus molestie leo, ac congue lectus nibh id dolor.]]></content>
</story>
</news>
and here is the php file:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Untitled Document</title>
<link href="design/style/main.css" rel="stylesheet" type="text/css" />
</head>
<body text="#FFFFFF">
<?php
$xml_file = "news.xml";
$xml_headline_key = "*NEWS*STORY*TITLE";
$xml_description_key = "*NEWS*STORY*CONTENT";
$xml_author_key = "*NEWS*STORY*AUTHOR";
$xml_date_key = "*NEWS*STORY*DATE";
$xml_summary_key = "*NEWS*STORY*SUMMARY";
$xml_id_key = "*NEWS*STORY*ID";
$story_array = array();
$counter = 0;
class xml_story{
var $headline, $description, $author, $date, $summary, $id;
}
function startTag($parser, $data){
global $current_tag;
$current_tag .= "*$data";
}
function endTag($parser, $data){
global $current_tag;
$tag_key = strrpos($current_tag, '*');
$current_tag = substr($current_tag, 0, $tag_key);
}
function contents($parser, $data){
global $current_tag, $xml_headline_key, $xml_description_key, $xml_id_key, $xml_author_key, $xml_date_key, $xml_summary_key, $counter, $story_array;
switch($current_tag){
case $xml_id_key:
$story_array[$counter] = new xml_story();
$story_array[$counter]->id = $data;
break;
case $xml_headline_key:
$story_array[$counter]->headline = $data;
break;
case $xml_author_key:
$story_array[$counter]->author = $data;
break;
case $xml_date_key:
$story_array[$counter]->date = $data;
break;
case $xml_summary_key:
$story_array[$counter]->summary = $data;
break;
case $xml_description_key:
$story_array[$counter]->description = $data;
$counter++;
break;
}
}
$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startTag", "endTag");
xml_set_character_data_handler($xml_parser, "contents");
$fp = fopen($xml_file, "r") or die("Could not open file");
$data = fread($fp, filesize($xml_file)) or die("Could not read file");
if(!(xml_parse($xml_parser, $data, feof($fp)))){
die("Error on line " . xml_get_current_line_number($xml_parser));
}
xml_parser_free($xml_parser);
fclose($fp);
?>
<center>
<table width="645" border="0" cellpadding="2px">
<tr>
<td width="350" valign="top">
<div class="news">
<table width="350" border="0" cellpadding="2px">
<?php
if($id) {
for($x=0;$x<count($story_array);$x++){
if($story_array[$x]->id == $id) {
echo " <tr><td class=\"newshead\">" . $story_array[$x]->headline . "</td></tr>
";
echo "
";
echo " <tr><td class=\"newscreator\">Posted by " . $story_array[$x]->author . " on " . $story_array[$x]->date . "</td></tr>
";
echo "
";
echo " <tr><td class=\"newscontent\">" . $story_array[$x]->description . "<br /><a href=\"home.php\">view all posts</a></td></tr><tr><td> </td></tr>
";
} else {
//do nothing
}
}
} else {
for($x=0;$x<count($story_array);$x++){
echo " <tr><td class=\"newshead\">" . $story_array[$x]->headline . "</td></tr>
";
echo "
";
echo " <tr><td class=\"newscreator\">Posted by " . $story_array[$x]->author . " on " . $story_array[$x]->date . "</td></tr>
";
echo "
";
echo " <tr><td class=\"newscontent\">" . $story_array[$x]->summary . "<br /><a href=\"home.php?id=" . $story_array[$x]->id . "\">[...]read the rest of this post</a></td></tr><tr><td> </td></tr>
";
}
}
?>
</table>
</div> </td>
<td width="80"> </td>
<td width="270" valign="top"><img src="design/images/buy_now_banner.gif" width="270" height="483" border="none" /></td>
</tr>
</table>
</center>
</body>
</html>
and when the xml file is done parsing, and I do a print_r(); on the array $story_array, this is what prints out…
for some reason it is splitting the data in the <content></content> tags into a couple of paragraphs and putting the second two sections in the array as an object of itself…
Array (
[0] => xml_story Object (
[headline] => hmmm…
[description] => Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent tortor neque, malesuada id, pharetra vitae, adipiscing at, ipsum. Sed accumsan dolor id velit. Etiam velit orci, tempor in, ultrices quis, pretium id, eros. Maecenas id lorem. Curabitur et elit sed lectus fermentum porta. Vestibulum odio urna, eleifend nec, fermentum a, vehicula eget, tortor. Vivamus in nisl sed odio egestas egestas. Donec consectetuer scelerisque leo. Maecenas ultricies risus nec enim. Maecenas malesuada lacus ut lacus. Vestibulum viverra, magna eget tincidunt posuere, leo magna facilisis urna, non consectetuer pede massa et orci.
Curabitur massa nunc, lobortis nec, imperdiet ac, pellentesque ac, risus. Aliquam erat volutpat. Morbi massa risus, rhoncus non, blandit ac, ultricies vel, sapien. Etiam neque pede, aliquet eu, molestie ac, scelerisque interdum, felis. Ut sodales. Proin purus. Maecenas mi dui, consequat vitae, gravida eget, pellentesque non, augue. Duis et leo. Nulla sit amet sem non dolor ullamcorper placera
[author] => Rob Carrillo
[date] => 04/19/08
[summary] => Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Praesent tortor neque, malesuada id, phare…
[id] => 1 )
[1] => stdClass Object (
[description] => t. Nam blandit condimentum nibh. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Duis ut ligula quis quam varius iaculis. Vivamus egestas, lacus vel aliquet molestie, ante sapien tincidunt eros, ultrices convallis mauris eros sed velit. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Etiam consectetuer.
Donec convallis ligula at purus. Nunc id quam. Aliquam id augue. Cras ut magna ut metus convallis dictum. Praesent ipsum leo, laoreet ut, porta vel, semper nec, quam. Donec orci erat, convallis a, eleifend vitae, fringilla dignissim, nisi. Fusce rhoncus convallis justo. Pellentesque non nisl ut lacus lacinia dignissim. Etiam felis turpis, luctus quis, dapibus ac, pretium vel, tortor. Vivamus nec lacus. Mauris at pede vel libero vehicula pretium. Maecenas pede. Nulla facilisi. Aliquam tempus tortor ut tortor. Cras interdum enim e )
[2] => stdClass Object (
[description] => u arcu. Pellentesque gravida, turpis eu scelerisque posuere, leo tellus molestie leo, ac congue lectus nibh id dolor. ) )