You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							163 lines
						
					
					
						
							4.9 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							163 lines
						
					
					
						
							4.9 KiB
						
					
					
				| <?php | |
| /* | |
| *  This program is free software; you can redistribute it and/or modify | |
| *  it under the terms of the GNU General Public License as published by | |
| *  the Free Software Foundation; either version 2 of the License, or | |
| *  (at your option) any later version. | |
| * | |
| *  This program is distributed in the hope that it will be useful, | |
| *  but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | |
| *  GNU General Public License for more details. | |
| * | |
| *  You should have received a copy of the GNU General Public License | |
| *  along with this program; if not, write to the Free Software | |
| *  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |
| */ | |
| 
 | |
| /* | |
| *  Written by Reverend Jim (jim@revjim.net) | |
| * | |
| *  http://revjim.net/code/xmlParser/ | |
| */ | |
| 
 | |
| class XMLParser { | |
|     var $ns2uri = array(); | |
|     var $uri2ns = array(); | |
|     var $unkcnt = 0; | |
|     var $data; // Holds the XML structure | |
|     var $xmldata; // Holds XML data | |
|     var $version = "0.3"; | |
| 
 | |
| 
 | |
|     function defineNs($ident, $uri = "") { | |
|         if ($uri == "") { | |
|             $uri = "::UNDEFINED::"; | |
|         } | |
|         $this->ns2uri[strtoupper($ident)] = $uri; | |
|         $this->uri2ns[$uri] = strtoupper($ident); | |
|     } | |
| 
 | |
|     function _getXmlChildren(&$vals, $ns, &$i) { | |
|         $children = array(); | |
| 
 | |
|         if ($vals[$i]['value']) { | |
|             array_push($children, $vals[$i]['value']); | |
|         } | |
|      | |
|         while (++$i < count($vals)) { | |
|             switch ($vals[$i]['type']) { | |
|                 case 'cdata': | |
|                     array_push($children, $vals[$i]['value']); | |
|                     break; | |
|      | |
|                 case 'complete': | |
|                     $tmpns = $this->getnamespaces($vals[$i]['attributes'],$ns); | |
|                     $tag = $this->_convertTagNs($vals[$i]['tag'],$tmpns); | |
|                     if($vals[$i]['value']) { | |
|                         array_push($children, array( | |
|                             'tag' => $tag, | |
|                             'attributes' => $vals[$i]['attributes'], | |
|                             'children' => array($vals[$i]['value']) | |
|                         )); | |
|                     } else { | |
|                         array_push($children, array( | |
|                             'tag' => $tag, | |
|                             'attributes' => $vals[$i]['attributes'] | |
|                         )); | |
|                     } | |
| 
 | |
|                     break; | |
|      | |
|                 case 'open': | |
|                     $tmpns = $this->getnamespaces($vals[$i]['attributes'],$ns); | |
|                     $tag = $this->_convertTagNs($vals[$i]['tag'],$tmpns); | |
|                     array_push($children, array( | |
|                         'tag' => $tag, | |
|                         'attributes' => $vals[$i]['attributes'], | |
|                         'children' => $this->_getXmlChildren($vals,$tmpns,$i) | |
|                     )); | |
|                     break; | |
|      | |
|                 case 'close': | |
|                     if ($vals[$i]['value']) { | |
|                         array_push($children, $vals[$i]['value']); | |
|                     } | |
|                     return $children; | |
|             } | |
|         } | |
|     } | |
| 
 | |
|     function _convertTagNs($tag,$ns) { | |
|         if($pos = strpos($tag,':')) { | |
|             $docns = substr($tag,0,$pos); | |
|             $doctag = substr($tag,$pos+1); | |
|         } else { | |
|             $docns = "::ROOT"; | |
|             $doctag = "$tag"; | |
|         } | |
| 
 | |
|         if ($ns[$docns]) { | |
|             $uri = $ns[$docns]; | |
|         } else { | |
|             $uri = "::UNDEFINED::"; | |
|         } | |
| 
 | |
|         if($this->uri2ns[$uri]) { | |
|             $parns = $this->uri2ns[$uri]; | |
|         } else { | |
|             $this->definens("::UNK" . $this->unkcnt, $uri); | |
|             $parns = "::UNK" . $this->unkcnt; | |
|             $this->unkcnt++; | |
|         } | |
| 
 | |
|         return $parns . ":" . $doctag; | |
|          | |
|     } | |
| 
 | |
|     function getXmlTree() { | |
|         return $this->data; | |
|     } | |
| 
 | |
|     function setXmlData($data) { | |
|         $this->xmldata = $data; | |
|     } | |
| 
 | |
|     function buildXmlTree() { | |
|         $p = xml_parser_create(); | |
|         xml_parser_set_option($p, XML_OPTION_SKIP_WHITE, 1); | |
|         xml_parse_into_struct($p, $this->xmldata, &$vals, &$index); | |
|         xml_parser_free($p); | |
|      | |
|         $this->data = array(); | |
|         $i = 0; | |
|         $ns = $this->getnamespaces($vals[$i]['attributes']); | |
|         array_push($this->data, array( | |
|             'tag' => $this->_convertTagNs($vals[$i]['tag'],$ns), | |
|             'attributes' => $vals[$i]['attributes'], | |
|             'children' => $this->_getXmlChildren($vals, $ns, $i) | |
|         )); | |
|     }     | |
| 
 | |
|     function getnamespaces($attribs,$ns = array()) { | |
|         if (is_array($attribs)) { | |
|             foreach($attribs as $key => $value) { | |
|                 $key = strtoupper($key); | |
|                 if (substr($key,0,5) == 'XMLNS') { | |
|                     if($pos = strpos($key,':')) { | |
|                         $ns[substr($key,$pos+1)] = $value; | |
|                     } else { | |
|                         $ns['::ROOT']= $value; | |
|                     } | |
|                 } | |
|             } | |
|         } | |
| 
 | |
| 
 | |
|         return $ns; | |
|     } | |
|                      | |
| 
 | |
| } | |
|      | |
| ?>
 | |
| 
 |