The document discusses using PHP to work with XML files. It covers reading and writing XML files using PHP, using different types of XML parsers like SimpleXML and DOM, manipulating XML data by adding/removing nodes, and getting values from XML nodes and their attributes. Tree-based parsers like SimpleXML are introduced as holding the entire XML document in memory, while event-based parsers stream through the file without loading it entirely into memory.
The document discusses using PHP to work with XML files. It covers reading and writing XML files using PHP, using different types of XML parsers like SimpleXML and DOM, manipulating XML data by adding/removing nodes, and getting values from XML nodes and their attributes. Tree-based parsers like SimpleXML are introduced as holding the entire XML document in memory, while event-based parsers stream through the file without loading it entirely into memory.
Services Aims of the lecture • At the end of today’s lecture students should be able to – Read an XML file saved on server – Write php code to manipulate xml files XML file • Consider the following file which is saved on server as note.xml: <?xml version="1.0" encoding="UTF-8"?> <note> <from>Jani</from> <to>Tove</to> <message>Remember me this weekend</message> </note> Generating XML using PHP code • The following code generates the above the xml file using php: <?php header("Content-type: text/xml"); echo "<?xml version='1.0' encoding='UTF-8'?>"; echo "<note>"; echo "<from>Jani</from>"; echo "<to>Tove</to>"; echo "<message>Remember me this weekend</message>"; echo "</note>"; ?> XML Parsers • To read and update, create and manipulate an XML document, you will need an XML parser. • In PHP there are two major types of XML parsers: – Tree-Based Parsers – Event-Based Parsers Tree-based parsers • Tree-based parsers holds the entire document in Memory and transforms the XML document into a Tree structure. It analyzes the whole document, and provides access to the Tree elements (DOM). • This type of parser is a better option for smaller XML documents, but not for large XML document as it causes major performance issues. • Example of tree-based parsers: – SimpleXML – DOM Event-based parsers • Event-based parsers do not hold the entire document in Memory, instead, they read in one node at a time and allow you to interact with in real time. Once you move onto the next node, the old one is thrown away. • This type of parser is well suited for large XML documents. It parses faster and consumes less memory. • Example of event-based parsers: – XMLReader – XML Expat Parser PHP SimpleXML Parser • SimpleXML is a PHP extension that allows us to easily manipulate and get XML data. • SimpleXML is a tree-based parser. • SimpleXML provides an easy way of getting an element's name, attributes and textual content if you know the XML document's structure or layout. • SimpleXML turns an XML document into a data structure you can iterate through like a collection of arrays and objects. • Compared to DOM or the Expat parser, SimpleXML takes a fewer lines of code to read text data from an element. Installation • As of PHP 5, the SimpleXML functions are part of the PHP core. • No installation is required to use these functions. PHP SimpleXML - Read From String • The PHP simplexml_load_string() function is used to read XML data from a string. • $myXMLData = "<?xml version='1.0' encoding='UTF-8'?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>"; Simple_xml_load() • The example below shows how to use the simplexml_load_string() function to read XML data from a string: • <?php $myXMLData = "<?xml version='1.0' encoding='UTF-8'?> <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note>"; $xml=simplexml_load_string($myXMLData) or die("Error: Cannot create object"); print_r($xml); ?> Output • SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder [body] => Don't forget me this weekend! ) Error Handling • Use the libxml functionality to retrieve all XML errors when loading the document and then iterate over the errors. Example: Trying to load a broken XML string • <?php libxml_use_internal_errors(true); $myXMLData = "<?xml version='1.0' encoding='UTF-8'?> <document> <user>John Doe</wronguser> <email>john@example.com</wrongemail> </document>"; $xml = simplexml_load_string($myXMLData); if ($xml === false) { echo "Failed loading XML: "; foreach(libxml_get_errors() as $error) { echo "<br>", $error->message; } } else { print_r($xml); } ?> Output produced • Failed loading XML: Opening and ending tag mismatch: user line 3 and wronguser Opening and ending tag mismatch: email line 4 and wrongemail PHP SimpleXML - Read From File • The PHP simplexml_load_file() function is used to read XML data from a file. • <?php $xml=simplexml_load_file("note.xml") or die("Error: Cannot create object"); print_r($xml); ?> Output produced • SimpleXMLElement Object ( [to] => Tove [from] => Jani [heading] => Reminder [body] => Don't forget me this weekend! ) PHP SimpleXML - Get Node Values • <?php $xml=simplexml_load_file("note.xml") or die("Error: Cannot create object"); echo $xml->to . "<br>"; echo $xml->from . "<br>"; echo $xml->heading . "<br>"; echo $xml->body; ?> Output • Tove Jani Reminder Don't forget me this weekend! Books.xml • <?xml version="1.0" encoding="utf-8"?> <bookstore> <book category="COOKING"> <title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> </book> <book category="CHILDREN"> <title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> </book> <book category="WEB"> <title lang="en-us">XQuery Kick Start</title> <author>James McGovern</author> <year>2003</year> <price>49.99</price> </book> <book category="WEB"> <title lang="en-us">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> </book> </bookstore> PHP SimpleXML - Get Node Values of Specific Elements • <?php $xml=simplexml_load_file("books.xml") or die("Error: Cannot create object"); echo $xml->book[0]->title . "<br>"; echo $xml->book[1]->title; ?> Output • Everyday Italian Harry Potter PHP SimpleXML - Get Node Values - Loop • The following example loops through all the <book> elements in the "books.xml" file, and gets the node values of the <title>, <author>, <year>, and <price> elements: • <?php $xml=simplexml_load_file("books.xml") or die("Error: Cannot create object"); foreach($xml->children() as $books) { echo $books->title . ", "; echo $books->author . ", "; echo $books->year . ", "; echo $books->price . "<br>"; } ?> Output • Everyday Italian, Giada De Laurentiis, 2005, 30.00 Harry Potter, J K. Rowling, 2005, 29.99 XQuery Kick Start, James McGovern, 2003, 49.99 Learning XML, Erik T. Ray, 2003, 39.95 PHP SimpleXML - Get Attribute Values • The following example gets the attribute value of the "category" attribute of the first <book> element and the attribute value of the "lang" attribute of the <title> element in the second <book> element: • <?php $xml=simplexml_load_file("books.xml") or die("Error: Cannot create object"); echo $xml->book[0]['category'] . "<br>"; echo $xml->book[1]->title['lang']; ?> Output • COOKING en PHP SimpleXML - Get Attribute Values - Loop • The following example gets the attribute values of the <title> elements in the "books.xml" file: • <?php $xml=simplexml_load_file("books.xml") or die("Error: Cannot create object"); foreach($xml->children() as $books) { echo $books->title['lang']; echo "<br>"; } ?> Output • en en en-us en-us Adding a new child • Add a child element to the <body> element and a new <footer> element: • <?php $note=<<<XML <note> <to>Tove</to> <from>Jani</from> <heading>Reminder</heading> <body>Don't forget me this weekend!</body> </note> XML; $xml = new SimpleXMLElement($note); // Add a child element to the body element $xml->body->addChild("date","2014-01-01"); // Add a child element after the last element inside note $footer = $xml->addChild("footer","Some footer text"); echo $xml->asXML(); ?> Output Tove Jani Reminder Don't forget me this weekend!2014-01-01 Some footer text Example: count() • <?php $xml=<<<XML <cars> <car name="Volvo"> <child/> <child/> <child/> <child/> </car> <car name="BMW"> <child/> <child/> </car> </cars> XML; $elem=new SimpleXMLElement($xml); foreach ($elem as $car) { printf("%s has %d children.<br>", $car['name'], $car->count()); } ?> Output • Volvo has 4 children. BMW has 2 children. References • Examples come from: http://www.w3schools.com/