Initial Commit of AgileBill Open Source
This commit is contained in:
271
modules/core/xml.inc.php
Normal file
271
modules/core/xml.inc.php
Normal file
@@ -0,0 +1,271 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* AgileBill - Open Billing Software
|
||||
*
|
||||
* This body of work is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the Open AgileBill License
|
||||
* License as published at http://www.agileco.com/agilebill/license1-4.txt
|
||||
*
|
||||
* For questions, help, comments, discussion, etc., please join the
|
||||
* Agileco community forums at http://forum.agileco.com/
|
||||
*
|
||||
* @link http://www.agileco.com/
|
||||
* @copyright 2004-2008 Agileco, LLC.
|
||||
* @license http://www.agileco.com/agilebill/license1-4.txt
|
||||
* @author Tony Landis <tony@agileco.com>
|
||||
* @package AgileBill
|
||||
* @version 1.4.93
|
||||
*/
|
||||
|
||||
class CORE_xml
|
||||
{
|
||||
function xml_to_array($file)
|
||||
{
|
||||
if (defined('AGILE_CORE_CACHE_DIR') && AGILE_CORE_CACHE_DIR != '') {
|
||||
$tfile = AGILE_CORE_CACHE_DIR."xml-".md5($file);
|
||||
if (file_exists($tfile)) {
|
||||
#clearstatcache();
|
||||
#$mt = filemtime($file);
|
||||
if (@filemtime($file) <= filemtime($tfile)) {
|
||||
#echo "cached: $file<br>";
|
||||
return unserialize(file_get_contents($tfile));
|
||||
}
|
||||
}
|
||||
#echo "cache miss: $file<br>";
|
||||
}
|
||||
if(!is_callable('simplexml_load_file') || !is_callable('dom_import_simplexml')) {
|
||||
// call old XML to array class
|
||||
$arr = xmlFileToArray($file, $includeTopTag = true, $lowerCaseTags = true);
|
||||
} else {
|
||||
// use SimpleXML class
|
||||
if(!is_file($file)) return false;
|
||||
$xml = simplexml_load_file ($file);
|
||||
if(is_object($xml)) {
|
||||
$dom = dom_import_simplexml ($xml);
|
||||
$arr["$dom->tagName"] = SimpleXML2Array($xml);
|
||||
}
|
||||
}
|
||||
if (defined('AGILE_CORE_CACHE_DIR') && AGILE_CORE_CACHE_DIR != '') {
|
||||
$fp = fopen($tfile,"wb");
|
||||
if ($fp) {
|
||||
fwrite($fp, serialize($arr));
|
||||
fclose($fp);
|
||||
}
|
||||
}
|
||||
return $arr;
|
||||
}
|
||||
|
||||
function array_to_xml() {
|
||||
}
|
||||
|
||||
function xml_string_to_array($string) {
|
||||
}
|
||||
}
|
||||
|
||||
// new XML to Array for PHP5 and SimpleXML
|
||||
function SimpleXML2Array($xml) {
|
||||
if (get_class($xml) == 'SimpleXMLElement') {
|
||||
$attributes = $xml->attributes();
|
||||
foreach($attributes as $k=>$v) {
|
||||
if ($v) $a[$k] = (string) $v;
|
||||
}
|
||||
$x = $xml;
|
||||
$xml = get_object_vars($xml);
|
||||
}
|
||||
if (is_array($xml)) {
|
||||
if (count($xml) == 0) return (string) $x; // for CDATA
|
||||
foreach($xml as $key=>$value) {
|
||||
$r[$key] = simplexml2array($value);
|
||||
}
|
||||
if (isset($a)) $r['@'] = $a; // Attributes
|
||||
return $r;
|
||||
}
|
||||
return (string) $xml;
|
||||
}
|
||||
|
||||
|
||||
function & toString( $fileName )
|
||||
{
|
||||
if ($content_array = file($fileName))
|
||||
{
|
||||
$file = implode("", $content_array);
|
||||
return $file;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Error
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function & xmlFileToArray($fileName, $includeTopTag = false, $lowerCaseTags = true)
|
||||
{
|
||||
// Definition file not found
|
||||
if (!file_exists($fileName))
|
||||
{
|
||||
// Error
|
||||
$false = false;
|
||||
return $false;
|
||||
}
|
||||
$p = xml_parser_create();
|
||||
xml_parse_into_struct($p,toString($fileName),$vals,$index);
|
||||
xml_parser_free($p);
|
||||
$xml = array();
|
||||
$levels = array();
|
||||
$multipleData = array();
|
||||
$prevTag = "";
|
||||
$currTag = "";
|
||||
$topTag = false;
|
||||
foreach ($vals as $val)
|
||||
{
|
||||
// Open tag
|
||||
if ($val["type"] == "open")
|
||||
{
|
||||
if (!_xmlFileToArrayOpen($topTag, $includeTopTag, $val, $lowerCaseTags,
|
||||
$levels, $prevTag, $multipleData, $xml))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// Close tag
|
||||
else if ($val["type"] == "close")
|
||||
{
|
||||
if (!_xmlFileToArrayClose($topTag, $includeTopTag, $val, $lowerCaseTags,
|
||||
$levels, $prevTag, $multipleData, $xml))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
// Data tag
|
||||
else if ($val["type"] == "complete" && isset($val["value"]))
|
||||
{
|
||||
$loc =& $xml;
|
||||
foreach ($levels as $level)
|
||||
{
|
||||
$temp =& $loc[str_replace(":arr#", "", $level)];
|
||||
$loc =& $temp;
|
||||
}
|
||||
$tag = $val["tag"];
|
||||
if ($lowerCaseTags)
|
||||
{
|
||||
$tag = strtolower($val["tag"]);
|
||||
}
|
||||
$loc[$tag] = str_replace("\\n", "\n", $val["value"]);
|
||||
}
|
||||
// Tag without data
|
||||
else if ($val["type"] == "complete")
|
||||
{
|
||||
_xmlFileToArrayOpen($topTag, $includeTopTag, $val, $lowerCaseTags,
|
||||
$levels, $prevTag, $multipleData, $xml);
|
||||
_xmlFileToArrayClose($topTag, $includeTopTag, $val, $lowerCaseTags,
|
||||
$levels, $prevTag, $multipleData, $xml);
|
||||
}
|
||||
}
|
||||
return $xml;
|
||||
}
|
||||
|
||||
|
||||
|
||||
function _xmlFileToArrayOpen(& $topTag, & $includeTopTag, & $val, & $lowerCaseTags,
|
||||
& $levels, & $prevTag, & $multipleData, & $xml)
|
||||
{
|
||||
// don't include top tag
|
||||
if (!$topTag && !$includeTopTag)
|
||||
{
|
||||
$topTag = $val["tag"];
|
||||
return false;
|
||||
}
|
||||
$currTag = $val["tag"];
|
||||
if ($lowerCaseTags)
|
||||
{
|
||||
$currTag = strtolower($val["tag"]);
|
||||
}
|
||||
$levels[] = $currTag;
|
||||
|
||||
// Multiple items w/ same name. Convert to array.
|
||||
if ($prevTag === $currTag)
|
||||
{
|
||||
if (!array_key_exists($currTag, $multipleData) ||
|
||||
!$multipleData[$currTag]["multiple"])
|
||||
{
|
||||
$loc =& $xml;
|
||||
foreach ($levels as $level)
|
||||
{
|
||||
$temp =& $loc[$level];
|
||||
$loc =& $temp;
|
||||
}
|
||||
$loc = array($loc);
|
||||
$multipleData[$currTag]["multiple"] = true;
|
||||
$multipleData[$currTag]["multiple_count"] = 0;
|
||||
}
|
||||
$multipleData[$currTag]["popped"] = false;
|
||||
$levels[] = ":arr#" . ++$multipleData[$currTag]["multiple_count"];
|
||||
}
|
||||
else
|
||||
{
|
||||
$multipleData[$currTag]["multiple"] = false;
|
||||
}
|
||||
|
||||
// Add attributes array
|
||||
if (array_key_exists("attributes", $val))
|
||||
{
|
||||
$loc =& $xml;
|
||||
foreach ($levels as $level)
|
||||
{
|
||||
$temp =& $loc[str_replace(":arr#", "", $level)];
|
||||
$loc =& $temp;
|
||||
}
|
||||
$keys = array_keys($val["attributes"]);
|
||||
foreach ($keys as $key)
|
||||
{
|
||||
$tag = $key;
|
||||
if ($lowerCaseTags)
|
||||
{
|
||||
$tag = strtolower($tag);
|
||||
}
|
||||
$loc["attributes"][$tag] = & $val["attributes"][$key];
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
function _xmlFileToArrayClose(& $topTag, & $includeTopTag, & $val, & $lowerCaseTags,
|
||||
& $levels, & $prevTag, & $multipleData, & $xml)
|
||||
{
|
||||
// don't include top tag
|
||||
if ($topTag && !$includeTopTag && $val["tag"] == $topTag)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
if(isset($currTag))
|
||||
{
|
||||
if (isset($multipleData[$currTag]["multiple"]))
|
||||
{
|
||||
$tkeys = array_reverse(array_keys($multipleData));
|
||||
foreach ($tkeys as $tkey)
|
||||
{
|
||||
if ($multipleData[$tkey]["multiple"] && !$multipleData[$tkey]["popped"])
|
||||
{
|
||||
array_pop($levels);
|
||||
$multipleData[$tkey]["popped"] = true;
|
||||
break;
|
||||
}
|
||||
else if (!$multipleData[$tkey]["multiple"])
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
$prevTag = array_pop($levels);
|
||||
if (strpos($prevTag, "arr#"))
|
||||
{
|
||||
$prevTag = array_pop($levels);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
?>
|
Reference in New Issue
Block a user