Prior to Jaxl v3.x, the most ugliest piece of code inside Jaxl library was handling of XML packets. If you are working with XMPP protocol which is all about sending and receiving XML packets, it can become a nightmare if you don’t have a proper XML manipulation library in your toolkit. For Jaxl v3.x, first thing I decided to write was JAXLXml class, which is a custom XML packet implementation with no external dependencies and is an extension over the ideas from Strophe.Builder class written by Jack Moffitt.
JAXLXml is generic enough to find a place inside any PHP application that requires easy and elegant XML packet creation. In this blog post, I will give an exhaustive overview of how to create XML packets using JAXLXml class.
Depending upon the need, there are several different ways of initializing a JAXLXml object:
$xml_obj = new JAXLXml($name, $ns, $attrs, $text);
$xml_obj = new JAXLXml($name, $ns, $attrs);
$xml_obj = new JAXLXml($name, $ns, $text);
$xml_obj = new JAXLXml($name, $attrs, $text);
$xml_obj = new JAXLXml($name, $attrs);
$xml_obj = new JAXLXml($name, $ns);
$xml_obj = new JAXLXml($name);
$name– the XML node name
$ns– the XML namespace
$attrs– Key-Value (KV) pair of XML attributes
$text– XML content
Here are a few examples for each constructor style shown above:
JAXLXml will sanitize attributes and text values as shown below:
Manipulating Attributes, Child Nodes and Content
Below is an exhaustive list of methods available over initialized JAXLXml object
$xml_obj for manipulating attributes, child nodes and content:
c($name, $ns=null, $attrs=array(), $text=null): Append a child node at current rover and update the rover to point at newly added child node. Rover is nothing but a pointer indicating the level in the XML tree where this and other methods will perform. When an JAXLXml instance is initialized, rover points to the top level node.
cnode($node): Append a child node given by
$node(a JAXLXml object) at current rover and update the rover to point at newly added child node.
t($text, $append=FALSE): Update text of the node pointed by current rover
top(): Move rover back to the top in the XML tree
up(): Move rover one step up the XML tree
attrs($attrs): Merge new attributes specified as KV pair
$attrswith existing attributes at the current rover.
match_attrs($attrs): Accepts a KV pair of attributes
$attrs, return bool if all keys exist and have same value as specified in the passed KV pair.
exists($name, $ns=null, $attrs=array()): Checks if a child with
$nameexist. If found, return matching child as JAXLXml object otherwise false. If multiple children exist with same name, this function will return on first matching child
update($name, $ns=null, $attrs=array(), $text=null): Update
$text(all at once) of an existing child node
to_string($parent_ns=null): Return string representation of JAXLXml object
The best thing one will find while working with JAXLXml class is that all the above methods are chain-able i.e. Any complex XML structure can be built with a single line of code.
Here is an example building a fairly nested XML structure in a single line of code: