Files
phoronix-test-suite/pts-core/objects/tandem_XmlReader.php
2008-04-02 10:15:24 -04:00

128 lines
3.2 KiB
PHP

<?php
/*
tandem_XmlReader: A very simple XML parser with a few extras... Does not support attributes on tags, etc.
A work in progress. Was designed for just some select needs in the past. No XML validation is done with this parser, etc.
Copyright Michael Larabel (C) 2004 - 2008
*/
class tandem_XmlReader
{
var $XML_DATA;
function __construct($XML)
{
$this->XML_DATA = $XML;
}
function getStatement($STATEMENT_NAME)
{
return $this->listStatements(TRUE, $STATEMENT_NAME);
}
function listStatements($SEARCH_DO = FALSE, $SEARCH_QUERY = "")
{
// TODO: add check to make sure it doesn't occur in XML, but before XML start after XML declaration
$XML_COPY = $this->XML_DATA;
preg_match_all("'<!--(.*?) -->'si", $XML_COPY, $STATEMENT_MATCHES);
$RETURN_ARRAY = array();
foreach($STATEMENT_MATCHES[0] as $statement)
{
$name = substr($statement, 0, strpos($statement, ':'));
$name = trim(strstr($name, ' '));
if($SEARCH_DO)
{
if($name == $SEARCH_QUERY)
{
$value = strstr($statement, ':');
$value = trim(substr($value, 1, strpos($value, "-->") - 1));
array_push($RETURN_ARRAY, $value);
}
}
else
{
array_push($RETURN_ARRAY, $name);
}
}
return $RETURN_ARRAY;
}
function getXMLValue($XML_TAG)
{
return $this->getValue($XML_TAG, $this->XML_DATA);
}
function getValue($XML_TAG, $XML_MATCH)
{
$XML_LOCATION_OFFSET = 0;
do
{
$LOCATION_NEXT_DEPTH = strpos($XML_TAG, '/', $XML_LOCATION_OFFSET);
if($LOCATION_NEXT_DEPTH === FALSE)
$LOCATION_NEXT_DEPTH = strlen($XML_TAG);
$THIS_XML_TAG = substr($XML_TAG, $XML_LOCATION_OFFSET, $LOCATION_NEXT_DEPTH - $XML_LOCATION_OFFSET);
preg_match("'<$THIS_XML_TAG>(.*?)</$THIS_XML_TAG>'si", $XML_MATCH, $NEW_MATCH);
if(sizeof($NEW_MATCH) > 1)
$XML_MATCH = $NEW_MATCH[1];
else
$XML_MATCH = null;
$XML_LOCATION_OFFSET = $LOCATION_NEXT_DEPTH + 1;
}
while($XML_LOCATION_OFFSET < strlen($XML_TAG));
return $XML_MATCH;
}
function getXMLArrayValues($XML_TAG)
{
return $this->getArrayValues($XML_TAG, $this->XML_DATA);
}
function getArrayValues($XML_TAG, $XML_MATCH)
{
$XML_ARRAY_VALUES = $this->LocationHierarchyToArray($XML_TAG);
$THIS_XML_CONTENTS = $XML_MATCH;
for($i = 0; $i < sizeof($XML_ARRAY_VALUES) - 2; $i++)
$THIS_XML_CONTENTS = $this->getValue($XML_ARRAY_VALUES[$i], $THIS_XML_CONTENTS);
$LAST_XML_VALUE = $XML_ARRAY_VALUES[sizeof($XML_ARRAY_VALUES) - 2];
preg_match_all("'<$LAST_XML_VALUE>(.*?)</$LAST_XML_VALUE>'si", $THIS_XML_CONTENTS, $XML_MATCHES);
$RETURN_ARRAY = array();
for($i = 0; $i < sizeof($XML_MATCHES[1]); $i++)
{
$THIS_ITEM = $this->getValue(end($XML_ARRAY_VALUES), $XML_MATCHES[1][$i]);
// if(!empty($THIS_ITEM))
array_push($RETURN_ARRAY, $THIS_ITEM);
}
return $RETURN_ARRAY;
}
function LocationHierarchyToArray($LOCATION)
{
$RETURN_ARRAY = array();
$TEMP_LOCATION = $LOCATION;
while(($POS_NEXT_DELIMITER = strpos($TEMP_LOCATION, '/')) !== FALSE)
{
array_push($RETURN_ARRAY, substr($TEMP_LOCATION, 0, $POS_NEXT_DELIMITER));
$TEMP_LOCATION = substr($TEMP_LOCATION, $POS_NEXT_DELIMITER + 1);
}
if(!empty($TEMP_LOCATION))
array_push($RETURN_ARRAY, $TEMP_LOCATION);
return $RETURN_ARRAY;
}
}
?>