Overview

Namespaces

  • None
  • PHP
  • picon

Classes

  • AbstractAjaxBehaviour
  • AbstractAssociatedMarkupSource
  • AbstractBehaviour
  • AbstractCallableOption
  • AbstractChoice
  • AbstractColumn
  • AbstractContextLoader
  • AbstractDatabaseDriver
  • AbstractInjectedDataProvider
  • AbstractJQueryBehaviour
  • AbstractJQueryUIBehaviour
  • AbstractLink
  • AbstractMarkupSource
  • AbstractMultipleChoice
  • AbstractOption
  • AbstractPageClassAuthorisationStrategy
  • AbstractRepeater
  • AbstractSingleChoice
  • AbstractTextComponent
  • AbstractToolbar
  • AbstractValidator
  • AjaxButton
  • AjaxEventBehaviour
  • AjaxFormComponentUpdateBehavior
  • AjaxFormSubmitBehavior
  • AjaxLink
  • AjaxRequestTarget
  • AllowAllAuthorisationStrategy
  • AnnotationRule
  • ApplicationConfigLoadListener
  • ApplicationContext
  • ApplicationContextLoadListener
  • ApplicationInitializer
  • ApplicationInitializerConfigLoadListenerCollection
  • ApplicationInitializerContextLoadListenerCollection
  • ApplicationProfile
  • Args
  • ArrayModel
  • ArrayOption
  • AttributeAppender
  • AttributeModifier
  • AutoContextLoader
  • AutoLoader
  • BasicModel
  • BooleanModel
  • BooleanOption
  • Border
  • BorderMarkupSourcingStratagy
  • BorderResolver
  • Button
  • CacheManager
  • CallbackAjaxCallDecorator
  • CallbackColumn
  • CallbackFunctionOption
  • CallbackOption
  • CallbackRowMapper
  • Check
  • CheckBox
  • CheckBoxGroup
  • CheckChoice
  • ChoiceRenderer
  • ClassNameRule
  • ClassNamespaceRule
  • ClassScanner
  • Comment
  • ComonDomainBase
  • Component
  • ComponentAfterRenderListenerCollection
  • ComponentAuthorisationListener
  • ComponentBeforeRenderListenerCollection
  • ComponentInitializationListenerCollection
  • ComponentInjector
  • ComponentInstantiationListenerCollection
  • ComponentRenderHeadListenerCollection
  • ComponentResolverHelper
  • ComponentTag
  • CompoundPropertyModel
  • Config
  • ConfigLoader
  • ContextLoaderFactory
  • DaoSupport
  • DataBaseTemplate
  • DataGridView
  • DataSource
  • DataSourceConfig
  • DataSourceFactory
  • DataSourceType
  • DataTable
  • DateField
  • DatePickerBehaviour
  • DefaultDataTable
  • DefaultJQueryUIBehaviour
  • DefaultMarkupSource
  • DefaultNotAuthorisedListener
  • DialogBehavior
  • DirectToPageComponentNotAuthorisedListener
  • DraggableBehaviour
  • DropDown
  • EmailAddressValidator
  • EmptyPanel
  • Enum
  • ExceptionPageRequestTarget
  • ExtendResolver
  • FeedbackMessage
  • FeedbackModel
  • FeedbackPanel
  • FileModel
  • FileUploadField
  • Form
  • FormComponent
  • FormComponentLabel
  • FormComponentPanel
  • FunctionOption
  • GridItem
  • GridView
  • HeaderContainer
  • HeaderPartContainer
  • HeaderResolver
  • HeaderResponse
  • HeaderToolbar
  • IdenticalValueValidator
  • Identifier
  • Injector
  • JQueryRenderHeadListener
  • JQueryUIRenderHeadListener
  • Label
  • LabeledMarkupContainer
  • Link
  • ListenerCollection
  • ListenerRequestResolver
  • ListenerRequestTarget
  • ListItem
  • ListMultiple
  • ListView
  • Localizer
  • ManualContextLoader
  • MarkupContainer
  • MarkupElement
  • MarkupLoader
  • MarkupParser
  • MarkupUtils
  • MaximumLengthValidator
  • MaximumValidator
  • MinimumLengthValidator
  • MinimumValidator
  • ModalWindow
  • MySqlDriver
  • MySqliDriver
  • NavigationLink
  • NavigationToolbar
  • Navigator
  • NumbericOption
  • NumericValidator
  • Objects
  • Options
  • PageInstanceRequestResolver
  • PageInstanceRequestTarget
  • PageMap
  • PageMapInitializationListenerCollection
  • PageNotFoundPage
  • PageNotFoundRequestTarget
  • PageRequestResolver
  • PageRequestTarget
  • PageRequestWithListenerTarget
  • PaginatingGridView
  • Panel
  • PanelMarkupSource
  • PanelResolver
  • PasswordField
  • PatternValidator
  • PiconApplication
  • PiconErrorHandler
  • PiconSerializer
  • PiconTag
  • PopupSettings
  • PropertyColumn
  • PropertyModel
  • PropertyOption
  • PropertyResolver
  • Radio
  • RadioChoice
  • RadioGroup
  • RangeLengthValidator
  • RangeValidator
  • RedirectRequestTarget
  • RepeatingView
  • RequestCycle
  • RequestResolverCollection
  • RequiredTextField
  • ResourceReference
  • ResourceRequestResolver
  • ResourceRequestTarget
  • SerializableClosure
  • SortableBehavior
  • StaticTabPanel
  • StringValidator
  • SubClassRule
  • Tab
  • TabCollection
  • TabPanel
  • TextArea
  • TextElement
  • TextField
  • TransparentMarkupContainer
  • ValidatableFormComponentWrapper
  • ValidationResponse
  • WebApplicationSecuritySettings
  • WebComponent
  • WebPage
  • WebRequest
  • WebResponse
  • WrappedCompoundModel
  • XMLDocument
  • XMLParser
  • XMLTag
  • XmlTagType

Interfaces

  • AjaxCallDecorator
  • ApplicationInitializerConfigLoadListener
  • ApplicationInitializerContextLoadListener
  • AuthorisationStrategy
  • Behaviour
  • BehaviourListener
  • CallDecoratorWrapper
  • ChoiceGroup
  • ClassScannerRule
  • Column
  • ComponentAfterRenderListener
  • ComponentAwareModel
  • ComponentBeforeRenderListener
  • ComponentInheritedModel
  • ComponentInitializationListener
  • ComponentInstantiationListener
  • ComponentNotAuthorisedListener
  • ComponentRenderHeadListener
  • ComponentResolver
  • CompoundModel
  • DatabaseDriver
  • DataBaseOperations
  • DataProvider
  • Detachable
  • Equalable
  • FormSubmitListener
  • FormSubmitter
  • Identifiable
  • InitializingBean
  • InjectOnWakeup
  • LinkListener
  • Listener
  • MarkupSource
  • Model
  • Pageable
  • PageMapInitializationListener
  • Request
  • RequestablePage
  • RequestResolver
  • RequestTarget
  • Response
  • RowMapper
  • Validatable
  • Validator
  • XmlElement

Exceptions

  • ConfigException
  • ConversionException
  • RestartRequestOnPageException
  • SQLException
  • UnAuthorisdeException
  • Overview
  • Namespace
  • Class
  • Tree
  • Deprecated
  • Todo
  1: <?php
  2: 
  3: /**
  4:  * Picon Framework
  5:  * http://code.google.com/p/picon-framework/
  6:  *
  7:  * Copyright (C) 2011-2012 Martin Cassidy <martin.cassidy@webquub.com>
  8: 
  9:  * Picon Framework is free software: you can redistribute it and/or modify
 10:  * it under the terms of the GNU General Public License as published by
 11:  * the Free Software Foundation, either version 3 of the License, or
 12:  * (at your option) any later version.
 13: 
 14:  * Picon Framework is distributed in the hope that it will be useful,
 15:  * but WITHOUT ANY WARRANTY; without even the implied warranty of
 16:  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 17:  *  General Public License for more details.
 18: 
 19:  * You should have received a copy of the GNU General Public License
 20:  * along with Picon Framework.  If not, see <http://www.gnu.org/licenses/>.
 21:  * */
 22: 
 23: namespace picon;
 24: 
 25: /**
 26:  * An xml file parser
 27:  * @see http://php.net/manual/en/book.xml.php
 28:  *
 29:  * Parses an XML into an array of XMLTag's
 30:  * 
 31:  * @author Martin Cassidy
 32:  * @package utilities
 33:  */
 34: class XMLParser
 35: {
 36:     private $parser;
 37:     private $stack = array();
 38:     private $depth = 0;
 39:     private $root;
 40:     protected $xmlFile;
 41:     private $data;
 42:     
 43:     /**
 44:      * Create a new XMLParser
 45:      * Sets up an internal parser including callback methods
 46:      */
 47:     public function __construct()
 48:     {
 49:         $this->parser = xml_parser_create('UTF-8');
 50:         xml_parser_set_option($this->parser, XML_OPTION_TARGET_ENCODING, 'UTF-8');
 51:         xml_parser_set_option($this->parser, XML_OPTION_CASE_FOLDING, 0);
 52:         xml_parser_set_option($this->parser, XML_OPTION_SKIP_WHITE, 1);
 53:         
 54:         xml_set_object($this->parser, $this);
 55:         xml_set_element_handler($this->parser, "startElement", "endElement");
 56:         xml_set_character_data_handler($this->parser, "characterData");
 57:     }
 58:     
 59:     /**
 60:      * Process the XML file into an array of XMLTag objects
 61:      * @param String $xmlFile Path to the XML file
 62:      * @return An array of XMLTag objects
 63:      */
 64:     public function parse($xmlFile)
 65:     {
 66:         $this->xmlFile = $xmlFile;
 67:         if (!($fp = @fopen($xmlFile, "r")))
 68:         {
 69:             throw new \FileException("Could not open XML input");
 70:         }
 71:         while ($data = fread($fp, 4096))
 72:         {
 73:             $this->data = $this->prepare($data);
 74:             if (!xml_parse($this->parser, $this->data, feof($fp)))
 75:             {
 76:                 $this->onXmlError(xml_error_string(xml_get_error_code($this->parser)), xml_get_current_line_number($this->parser));
 77:             }
 78:         }
 79:         return $this->root;
 80:     }
 81:     
 82:     protected function prepare($data)
 83:     {
 84:         return $data;
 85:     }
 86:     
 87:     /**
 88:      * Callback for the xml parser when a new element starts
 89:      * @param resource $parser The xml parser
 90:      * @param String $name Name of the element
 91:      * @param Array $attributes array of attributes
 92:      */
 93:     private function startElement($parser, $name, $attributes) 
 94:     {
 95:         $tag = $this->newElement($name, $attributes);
 96:         $this->stack[$this->depth] = $tag;
 97:         
 98:         $close = $this->data[$this->getPreceedingCharacter($parser)];
 99:         
100:         if($close=='/')
101:         {
102:             $tag->setTagType(new XmlTagType(XmlTagType::OPENCLOSE));
103:         }
104:         
105:         if($this->depth==0)
106:         {
107:             //The root tag
108:             $this->root = $tag;
109:         }
110:         else
111:         {
112:             $this->stack[$this->depth-1]->addChild($tag);
113:         }
114:         
115:         $this->depth++;
116:     }
117: 
118:     protected function newElement($name, $attributes)
119:     {
120:         return new XMLTag($name, $attributes);
121:     }
122:     
123:     protected function onXmlError($errorCode, $errorMessage)
124:     {
125:         throw new \XMLException(sprintf("XML error: %s at line %d of file %s", $errorCode,$errorMessage, $this->xmlFile));
126:     }
127:     
128:     /**
129:      * Callback for the xml parser when an element ends
130:      * @param resource $parser The xml parser
131:      * @param String $name Name of the element
132:      */
133:     private function endElement($parser, $name) 
134:     {
135:         $this->depth--;
136:     }
137:     
138:     /**
139:      * Callback for the xml parser when the character data of an element is
140:      * reached
141:      * @param resource $parser The xml parser
142:      * @param String $data The character data
143:      */
144:     private function characterData($parser, $data) 
145:     {
146:         $this->onCharacterData($data, $this->stack[$this->depth-1]);
147:     }
148:     
149:     protected function onCharacterData($data, XMLTag $element)
150:     {
151:         $data = trim($data);
152:         if(!empty($data))
153:         {
154:             $element->addChild(new TextElement($data));
155:         }
156:     }
157:     
158:     /**
159:      * Locates a character preceding the &gt; of the start element.
160:      * This works only when called from startElement and has been altered
161:      * to allow for differences in the return of xml_get_current_byte_index in 
162:      * different versions of lib xml
163:      * 
164:      * @param XML Parser $parser
165:      * @return int 
166:      */
167:     private function getPreceedingCharacter($parser)
168:     {
169:         $index = xml_get_current_byte_index($parser);
170:         if (isset($this->data[$index])) 
171:         {
172:             if($this->data[$index]=='<')
173:             {
174:                 return strpos(substr($this->data, $index), '>')+$index-1;
175:             }
176:             else
177:             {
178:                 return $index;
179:             }
180:         } 
181:         else 
182:         {
183:             $length = strlen($this->data);
184:             return $length-1;
185:         }
186:     }
187: }
188: 
189: ?>
190: 
Picon Framework API documentation generated by ApiGen 2.7.0