Jump to content

PHP and MySQL Programming/XML and PHP

From Wikibooks, open books for an open world

Introduction

[edit | edit source]

XML (eXtensible Markup Language) is used in mainstream development. It might have started off as an attempt at a web standard, but is now used even in more traditional applications as a document standard. For example, the Open Document Format employed by Sun in their StarOffice and OpenOffice suites is based on XML.

Because of its wide-spread use in the IT industry, it is fitting that we as PHP developers know how to make use of XML files in our PHP applications.

XML Structure

[edit | edit source]

Since XML documents are extensible, there are no limits to the tags that you can create to define data with. Here is an example of a simple XML document:

<?xml version="1.0"?> <document> <title>Isn't this simple!</title> <body>XML is as simple as pie. :-)</body> </document> 

The reason that it looks so simple, is because it is so simple! Just as in HTML, elements are enclosed by angled brackets: "<" and ">", where the start element differs from the end element by the exclusion of a forward slash: "/".

Creating an XML Parser in PHP

[edit | edit source]

Defining the XML Parser

[edit | edit source]

In PHP, you define an XML Parser by using the xml_parser_create() function as shown below.

<? $parser = xml_parser_create(ENCODING); ?> 

You can think of the $parser variable in terms of a parsing engine for the XML document. Note that the ENCODING can be either:

1. ISO-8859-1 (default)

2. US-ASCII

3. UTF-8

Defining the Element Handlers

[edit | edit source]

Element handlers are defined by means of the xml_set_element_handler() function as follows:

<? xml_set_element_handler(XML_PARSER, START_FUNCTION, END_FUNCTION); ?> 

The three arguments accepted by the xml_set_element_handler() function are:

1. XML_PARSER - The variable that you created when you called the xml_parser_create() function.

2. START_FUNCTION - The name of the function to call when the parser encounters a start element.

3. END_FUNCTION - The name of the function to call when the parser encounters an end element.

e.g.:

<?$parser=xml_parser_create();xml_set_element_handler($parser,"startElement","endElement");?>

Defining Character Handlers

[edit | edit source]

Character handlers are created by means of the set_character_handler() function as follows:

<? xml_set_character_handler(XML_PARSER, CHARACTER_FUNCTION); ?> 

The two arguments accepted by the set_character_handler() function are:

1. XML_PARSER - The variable that you created when you called the xml_parser_create() function.

2. CHARACTER_FUNCTION - The name of the function to call when the parser encounters character data.

Starting the Parser

[edit | edit source]

To finally start the parser, we call the xml_parse() function as follows:

<? xml_parse(XML_PARSER, XML); ?> 

The two arguments accepted by the xml_parse() function are:

1. The variable that you created when you called the xml_parser_create() function.

2. The XML that is to be parsed.

e.g.:

<?$f=fopen("simple.xml",'r');$data=fread($f,filesize("simple.xml"));xml_parse($parser,$data);?>

Cleaning Up

[edit | edit source]

After parsing an XML document, it is considered good practice to free up the memory that is holding the parser. This is done by calling the xml_parser_free() function as follows:

<? xml_parser_free(XML_PARSER); ?> 

Example

[edit | edit source]
<?# --- Element Functions ---functionstartElement($parser,$name,$attributes){# ... some code}functionendElement($parser,$name){# ... some code}functioncharacterData($parser,$data){# ... some code}functionload_data($file){$f=fopen($file,'r');$data=fread($f,filesize($file));return$data;}# --- Main Program Body ---$file="simple.xml";$parser=xml_parser_create();xml_set_element_handler($parser,"startElement","endElement");xml_set_character_data_handler($parser,"characterData");xml_parse($parser,load_data($file));xml_parser_free($parser);?>

Parsing XML Documents

[edit | edit source]

We have seen the steps needed to successfully parse a XML document with PHP. Lets take a moment to reflect on how these steps are interconnected.

When a XML parser is initialized, php will go through the XML file. When a starting tag is found, a predefined function created by you, the programmer, is called. The same thing happens when php encounters the text between tags, and the end tags.

Here is a complete example of parsing XML documents. This example is a RSS reader which can be used to display News Articles from any RSS feed which conforms to RSS 1.0 standards.

Example

[edit | edit source]
 <html> <head> <title> Google Articles </title> </head> <body> &lt;h2>Google Articles&lt;/h2> &lt;dl><?php$insideitem=false;$tag="";$title="";$description="";$link="";functionstartElement($parser,$name,$attrs){global$insideitem,$tag,$title,$description,$link;if($insideitem){$tag=$name;}elseif($name=="ITEM"){$insideitem=true;}}functionendElement($parser,$name){global$insideitem,$tag,$title,$description,$link;if($name=="ITEM"){printf("&lt;dt>&lt;b><a href='%s'>%s</a>&lt;/b>&lt;/dt>",trim($link),trim($title));printf("&lt;dd>%s&lt;/dd>",trim($description));$title="";$description="";$link="";$insideitem=false;}}functioncharacterData($parser,$data){global$insideitem,$tag,$title,$description,$link;if($insideitem){switch($tag){case"TITLE":$title.=$data;break;case"DESCRIPTION":$description.=$data;break;case"LINK":$link.=$data;break;}}}$xml_parser=xml_parser_create();xml_set_element_handler($xml_parser,"startElement","endElement");xml_set_character_data_handler($xml_parser,"characterData");# $fp = fopen("http://www.newsforge.com/index.rss", 'r')$fp=fopen("http://news.google.co.za/nwshp?hl=en&tab=wn&q=&output=rss",'r')ordie("Error reading RSS data.");while($data=fread($fp,4096)){xml_parse($xml_parser,$data,feof($fp))ordie(sprintf("XML error: %s at line %d",xml_error_string(xml_get_error_code($xml_parser)),xml_get_current_line_number($xml_parser)));}fclose($fp);xml_parser_free($xml_parser);?> &lt;/dl> </body> </html>

Dumping Database Contents into an XML File

[edit | edit source]


close