%PDF- %PDF-
Direktori : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/ |
Current File : /www/varak.net/mail2.varak.net_old/libraries/afterlogic/common/xml.php |
<?php /* * Copyright 2004-2014, AfterLogic Corp. * Licensed under AGPLv3 license or AfterLogic license * if commercial version of the product was purchased. * See the LICENSE file for a full license statement. */ /** * @package Api */ class CXmlDomNode { /** * @var string */ public $TagName; /** * @var string */ public $Value; /** * @var string */ public $Comment; /** * @var array */ public $Attributes; /** * @var array */ public $Children; /** * @param string $sTagName * @param string $sValue = null * @param bool $bIsCDATA = false * @param bool $bIsSimpleCharsCode = false * @param string $sNodeComment = '' */ public function __construct($sTagName, $sValue = null, $bIsCDATA = false, $bIsSimpleCharsCode = false, $sNodeComment = '') { $this->Attributes = array(); $this->Children = array(); $this->TagName = $sTagName; $this->Value = ($bIsCDATA && null !== $sValue) ? '<![CDATA['. (($bIsSimpleCharsCode) ? api_Utils::EncodeSimpleSpecialXmlChars($sValue) : api_Utils::EncodeSpecialXmlChars($sValue)) .']]>' : $sValue; $this->Comment = $sNodeComment; } /** * @param CXmlDomNode &$oNode */ public function AppendChild(&$oNode) { if ($oNode) { $this->Children[] =& $oNode; } } /** * @param CXmlDomNode &$oNode */ public function PrependChild(&$oNode) { if ($oNode) { array_unshift($this->Children, $oNode); } } /** * @param string $sName * @param string $sValue */ public function AppendAttribute($sName, $sValue) { $this->Attributes[$sName] = $sValue; } /** * @param string $sTagName * @return &CXmlDomNode */ public function &GetChildNodeByTagName($sTagName) { $iNodeKey = null; $oCXmlDomNode = null; $aNodeKeys = array_keys($this->Children); foreach ($aNodeKeys as $iNodeKey) { if ($this->Children[$iNodeKey] && $this->Children[$iNodeKey]->TagName === $sTagName) { $oCXmlDomNode =& $this->Children[$iNodeKey]; break; } } return $oCXmlDomNode; } /** * @param string $sTagName * @return string */ public function GetChildValueByTagName($sTagName) { $sResult = ''; $oNode =& $this->GetChildNodeByTagName($sTagName); if (null !== $oNode) { $sResult = api_Utils::DecodeSpecialXmlChars($oNode->Value); } return $sResult; } /** * @param bool $bSplitLines = false * @return string */ public function ToString($bSplitLines = false) { $sAttributes = ''; foreach ($this->Attributes as $sName => $sValue) { $sName = htmlspecialchars($sName); $sValue = htmlspecialchars($sValue); $sAttributes .= ' '.$sName.'="'.$sValue.'"'; } $sChilds = ''; $iKeyIndex = null; if (0 < count($this->Children)) { foreach (array_keys($this->Children) as $iKeyIndex) { $sChilds .= $this->Children[$iKeyIndex]->ToString($bSplitLines); if ($bSplitLines) { $sChilds .= "\r\n"; } } if ($bSplitLines) { $aLines = explode("\r\n", $sChilds); $sChilds = ''; foreach ($aLines as $sLine) { $sChilds .= ($sLine !== '') ? sprintf("\t%s\r\n", $sLine) : ''; } } } $sCommentPart = (empty($this->Comment)) ? '' : "<!-- ".$this->Comment." -->\r\n"; if ($sChilds === '' && null === $this->Value) { $sOutStr = sprintf('<%s%s />', $this->TagName, $sAttributes); if ($bSplitLines) { $sOutStr .= "\r\n"; } return $sCommentPart.$sOutStr; } $sValue = (null !== $this->Value) ? trim($this->Value) : ''; if ($bSplitLines) { if ($sValue !== '' && $sChilds === '') { return $sCommentPart.sprintf('<%s%s>%s</%s>', $this->TagName, $sAttributes, $sValue, $this->TagName); } if ($sValue === '' && $sChilds === '' ) { return $sCommentPart.sprintf('<%s%s />', $this->TagName, $sAttributes); } return $sCommentPart.sprintf("<%s%s>%s\r\n%s</%s>\r\n", $this->TagName, $sAttributes, $sValue, $sChilds, $this->TagName); } return $sCommentPart.sprintf('<%s%s>%s%s</%s>', $this->TagName, $sAttributes, $sValue, $sChilds, $this->TagName); } /** * @param string $sName * @param string $sDefault = null * @return string */ public function GetAttribute($sName, $sDefault = null) { return isset($this->Attributes[$sName]) ? api_Utils::DecodeSpecialXmlChars($this->Attributes[$sName]) : $sDefault; } } /** * @package Api */ class CXmlDocument { /** * @var CXmlDomNode */ public $XmlRoot = null; /** * @param string $sName * @param string $sValue */ public function CreateElement($sName, $sValue = null) { $this->XmlRoot = new CXmlDomNode($sName, $sValue); } /** * @param string $sXmlText * @return bool */ public function ParseFromString($sXmlText) { $bResult = false; if (!empty($sXmlText)) { $oParser = xml_parser_create(); xml_parser_set_option($oParser, XML_OPTION_CASE_FOLDING, false); xml_parser_set_option($oParser, XML_OPTION_TARGET_ENCODING, 'UTF-8'); // xml_parser_set_option($oParser, XML_OPTION_SKIP_WHITE, true); xml_set_element_handler($oParser, array(&$this, '_startElement'), array(&$this, '_endElement')); xml_set_character_data_handler($oParser, array(&$this, '_charData')); $bResult = xml_parse($oParser, $sXmlText); xml_parser_free($oParser); } return (bool) $bResult; } /** * @param bool $bSplitLines * @return string */ public function ToString($bSplitLines = false) { $sOutStr = '<'.'?'.'xml version="1.0" encoding="utf-8"?'.'>'; if ($bSplitLines) { $sOutStr .= "\r\n"; } if (null !== $this->XmlRoot) { $sOutStr .= $this->XmlRoot->ToString($bSplitLines); } return $sOutStr; } /** * @param string $sFileName * @return bool */ public function LoadFromFile($sFileName) { $sXmlData = @file_get_contents($sFileName); if (false !== $sXmlData) { return $this->ParseFromString($sXmlData); } return false; } /** * @param string $sFileName * @return bool */ public function SaveToFile($sFileName) { $bResult = false; $rFilePointer = @fopen($sFileName, 'wb'); if ($rFilePointer) { $bResult = (false !== @fwrite($rFilePointer, $this->ToString(true))); $bResult = @fclose($rFilePointer); } return $bResult; } /** * @param string $sName * @return string */ public function GetParamValueByName($sName) { $oParam =& $this->getParamNodeByName($sName); return (null !== $oParam && isset($oParam->Attributes['value'])) ? api_Utils::DecodeSpecialXmlChars($oParam->Attributes['value']) : ''; } /** * @param string $sName * @return string */ public function GetParamTagValueByName($sName) { $oParam =& $this->getParamNodeByName($sName); return (null !== $oParam) ? api_Utils::DecodeSpecialXmlChars($oParam->Value) : ''; } /** * @param string $sName * @return object */ protected function &getParamNodeByName($sName) { $iNodeKey = null; $oNull = null; if ($this->XmlRoot && is_array($this->XmlRoot->Children)) { $aNodeKeys = array_keys($this->XmlRoot->Children); foreach ($aNodeKeys as $iNodeKey) { if ($this->XmlRoot->Children[$iNodeKey]->TagName == 'param' && isset($this->XmlRoot->Children[$iNodeKey]->Attributes['name']) && $this->XmlRoot->Children[$iNodeKey]->Attributes['name'] == $sName) { return $this->XmlRoot->Children[$iNodeKey]; } } } return $oNull; } /** * @access private * @param object $oParser * @param string $sName * @param array $aAttributes */ public function _startElement($oParser, $sName, $aAttributes) { $this->_nullFunction($oParser); $oNode = new CXmlDomNode($sName); $oNode->Attributes = $aAttributes; if ($this->XmlRoot == null) { $this->XmlRoot =& $oNode; } else { $oRootNode = null; $oRootNode =& $this->_stack[count($this->_stack) - 1]; $oRootNode->Children[] =& $oNode; } $this->_stack[] =& $oNode; } /** * @access private */ public function _endElement() { array_pop($this->_stack); } /** * @access private * @param object $oParser * @param string $sText */ function _charData($oParser, $sText) { $oNode = null; $this->_nullFunction($oParser); $oNode =& $this->_stack[count($this->_stack) - 1]; if ($oNode->Value == null) { $oNode->Value = ''; } if ($sText == '>') { $oNode->Value .= '>'; } else if ($sText == '<') { $oNode->Value .= '<'; } else { $oNode->Value .= $sText; } } /** * @access private * @return bool */ public function _nullFunction() { return true; } }