Code and Coffee


Quick Snippets: PHP XML Parsing

Posted on August 29, 2006, under Development.

Like many, I am limited to PHP 4 on most of my web servers, that until Plesk and SWSoft decide to support PHP 5. PHP 5 has advanced a lot in XML parsing, so I am looking forward to getting into it. So this XML parsing class is on that I have used for the last several years. It’s really easy to use, and simple for just about any situation.

The Class

[php]
class CXMLParser
{
// Variables
var $m_aData;
var $m_aStack;

// Class creation
function CXMLParser()
{
$this->m_aData = array();
$this->m_aStack = array();
}

// Parse
function parse($strData)
{
// Declare variables
$xmlParser = xml_parser_create();

// Set parser to this
xml_set_object($xmlParser, $this);

// Parse XML
xml_set_element_handler($xmlParser, “XML_StartElement”, “XML_EndElement”);
xml_set_character_data_handler($xmlParser, “XML_CharacterData”);
if (xml_parse($xmlParser, $strData, true) == false)
{
return false;
}

// Free parser
xml_parser_free($xmlParser);

return true;
}

// Get data
function getData()
{
return $this->m_aData;
}

function &XML_CurrElement()
{
$aCurr = &$this->m_aData;

foreach ($this->m_aStack as $strNode)
{
$strTemp = & $aCurr[$strNode];
$aCurr = & $strTemp;
}

return $aCurr;
}

function XML_AddNode($strName)
{
$aCurr = &$this->XML_CurrElement();
if (!array_key_exists($strName, $aCurr))
{
$aCurr[$strName] = array();
}
}

function XML_StartElement($xmlParser, $strName, $aAttrb)
{

$this->XML_AddNode($strName);
$this->m_aStack[] = $strName;
}

function XML_EndElement($xmlParser, $strName)
{

$aPopped = array_pop($this->m_aStack);
assert(’($aPopped == $strName)’);
}

function XML_CharacterData($xmlParser, $aData)
{
$aCurr = &$this->XML_CurrElement();

if (isset($aCurr["_data"]))
{
$aCurr["_data"] .= $aData;
}
else
{
$aCurr["_data"] = $aData;
}
}
}
?>
[/php]

Usage:

[php]
$cXMLParser = new CXMLParser();
if ($cXMLParser->parse(”1“))
{
$aAPIData = $cXMLParser->getData();
die($aAPIData["DATA"]["VALUE"]["_data"]);
}
[/php]

Popularity: 4% [?]