source: OWR/XML.php @ 22257f

Revision 22257f, 5.2 KB checked in by pierre-alain <pierre-alain@…>, 9 years ago (diff)

v0.1a2

  • Property mode set to 100644
Line 
1<?php
2/**
3 * Object used to manipulate XML
4 *
5 * PHP 5
6 *
7 * OWR - OpenWebReader
8 *
9 * Copyright (c) 2009, Pierre-Alain Mignot
10 *
11 * Home page: http://openwebreader.org
12 *
13 * E-Mail: contact@openwebreader.org
14 *
15 * All Rights Reserved
16 *
17 * This program is free software; you can redistribute it and/or modify
18 * it under the terms of the GNU General Public License as published by
19 * the Free Software Foundation; either version 2 of the License, or
20 * (at your option) any later version.
21 *
22 * This program is distributed in the hope that it will be useful,
23 * but WITHOUT ANY WARRANTY; without even the implied warranty of
24 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
25 * GNU General Public License for more details.
26 *
27 * You should have received a copy of the GNU General Public License
28 * along with this program; if not, write to the Free Software
29 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
30 *
31 * @author Pierre-Alain Mignot <contact@openwebreader.org>
32 * @copyright Copyright (c) 2009, Pierre-Alain Mignot
33 * @license http://www.gnu.org/copyleft/gpl.html
34 * @package OWR
35 */
36namespace OWR;
37/**
38 * This object is usefull for XML manipulation
39 *
40 * @uses Strings string usefull tools
41 * @package OWR
42 */
43class XML
44{
45    /**
46     * Serialize an array to xml
47     *
48     * @static
49     * @access public
50     * @param array $arr the array to convert
51     * @param string $rootEl name of the root element
52     * @param int $statusCode the status code of the response, optional
53     * @param mixed $dom \DOMDocument node, recursion
54     * @param mixed $domel \DOMElement node, recursion
55     * @return string the xml representation of $arr
56     */
57    static public function serialize(array $arr, $rootEl = '', $statusCode = 0, \DOMDocument $dom = null, \DOMElement $domel = null)
58    {
59        if(isset($dom))
60        {
61            foreach($arr as $k=>$v)
62            {
63                if(is_numeric($k)) $k = '_'.$k;
64                else
65                {
66                    $k = preg_replace('/[^a-z0-9_]/i', '_', $k);
67                }
68
69                if(is_array($v))
70                {
71                    $element = $dom->createElement($k);
72                    self::serialize($v, '', 0, $dom, $element);
73                    $domel->appendChild($element);
74                }
75                else
76                {
77                    $domel->appendChild($dom->createElement($k, Strings::toXML($v)));
78                }
79            }
80        }
81        else
82        {
83            $dom = new \DOMDocument('1.0', 'utf-8');
84            $el = $dom->createElement($rootEl);
85            empty($statusCode) || $el->setAttribute('status', (int) $statusCode);
86            $dom->appendChild($el);
87            foreach($arr as $k=>$v)
88            {
89                if(is_numeric($k)) $k = '_'.$k;
90                else
91                {
92                    $k = preg_replace('/[^a-z0-9_]/i', '_', $k);
93                }
94
95                if(is_array($v))
96                {
97                    $element = $dom->createElement($k);
98                    self::serialize($v, '', 0, $dom, $element);
99                    $el->appendChild($element);
100                }
101                else
102                {
103                    $el->appendChild($dom->createElement($k, Strings::toXML($v)));
104                }
105            }
106            $dom->formatOutput = true;
107            return $dom->saveXML();
108        }
109    }
110
111    /**
112     * Unserialize xml string to associative array
113     *
114     * @static
115     * @access public
116     * @param array $xml the xml string to convert
117     * @param mixed $reader \XMLReader the xmlreader instance, recursion
118     * @param array &$arr the associative array, recursion
119     * @param string $localName the current node name
120     * @return array the array representing $xml, false on error
121     */
122    static public function unserialize($xml = '', \XMLReader $reader = null, &$arr = array(), $localName = '')
123    {
124        if(!isset($reader))
125        {
126            libxml_use_internal_errors(true);
127
128            $reader = new \XMLReader();
129
130            if(!@$reader->XML($xml, 'UTF-8', LIBXML_NOBLANKS | LIBXML_NOCDATA))
131            {
132                return false;
133            }
134        }
135
136        if(!empty($localName))
137        {
138            isset($arr[$localName]) || $arr[$localName] = array();
139            $node =& $arr[$localName];
140        }
141        else $node =& $arr;
142
143        while(@$reader->read())
144        {
145            if(\XMLReader::ELEMENT === $reader->nodeType)
146            {
147                if($reader->isEmptyElement && !$reader->hasValue) continue;
148
149                $localName = $reader->localName;
150                if(0 === mb_strpos($localName, '_', 0, 'UTF-8'))
151                    $localName = mb_substr($localName, 1, mb_strlen($localName, 'UTF-8'), 'UTF-8');
152                isset($node[$localName]) || $node[$localName] = null;
153                if(!$reader->isEmptyElement)
154                    self::unserialize(null, $reader, $node, $localName);
155            }
156            elseif(\XMLReader::END_ELEMENT === $reader->nodeType)
157            {
158                $node =& $arr;
159            }
160            elseif(\XMLReader::TEXT === $reader->nodeType)
161            {
162                is_string($node) || $node = '';
163                $node .= $reader->value;
164            }
165        }
166
167        return $node;
168    }
169}
Note: See TracBrowser for help on using the repository browser.