pax_global_header00006660000000000000000000000064120561775000014515gustar00rootroot0000000000000052 comment=e8a28f7a48237851a3910ee905d9646548d4d9db php-horde-xml-element-2.0.1/000077500000000000000000000000001205617750000156305ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/000077500000000000000000000000001205617750000216165ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/doc/000077500000000000000000000000001205617750000223635ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/doc/Horde/000077500000000000000000000000001205617750000234245ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/doc/Horde/Xml/000077500000000000000000000000001205617750000241645ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/doc/Horde/Xml/Element/000077500000000000000000000000001205617750000255555ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/doc/Horde/Xml/Element/COPYING000066400000000000000000000024301205617750000266070ustar00rootroot00000000000000 Copyright 1999-2012 Horde LLC. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE HORDE PROJECT OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/lib/000077500000000000000000000000001205617750000223645ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/lib/Horde/000077500000000000000000000000001205617750000234255ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/lib/Horde/Xml/000077500000000000000000000000001205617750000241655ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/lib/Horde/Xml/Element.php000066400000000000000000000473561205617750000263060ustar00rootroot00000000000000 * @license http://www.horde.org/licenses/bsd BSD * @category Horde * @package Xml_Element */ /** * Wraps a DOMElement allowing for SimpleXML-like access to attributes. * * @method mixed TAGNAME() To get the un-wrapped value of a node, use * method syntax ($xml_element->tagname()). This will return the * string value of the tag if it is a single tag, an array of * Horde_Xml_Element objects if there are multiple tags, or null if * the tag does not exist. * * @author Chuck Hagenbuch * @license http://www.horde.org/licenses/bsd BSD * @category Horde * @package Xml_Element */ class Horde_Xml_Element implements ArrayAccess { /** * @var array */ protected static $_namespaces = array( 'opensearch' => 'http://a9.com/-/spec/opensearchrss/1.0/', 'atom' => 'http://www.w3.org/2005/Atom', 'rss' => 'http://blogs.law.harvard.edu/tech/rss', 'rdf' => 'http://www.w3.org/1999/02/22-rdf-syntax-ns', ); /** * Get the full version of a namespace prefix * * Looks up a prefix (atom:, etc.) in the list of registered * namespaces and returns the full namespace URI if * available. Returns the prefix, unmodified, if it's not * registered. * * @return string */ public static function lookupNamespace($prefix) { return isset(self::$_namespaces[$prefix]) ? self::$_namespaces[$prefix] : $prefix; } /** * Add a namespace and prefix to the registered list * * Takes a prefix and a full namespace URI and adds them to the * list of registered namespaces for use by * Horde_Xml_Element::lookupNamespace(). * * @param string $prefix The namespace prefix * @param string $namespaceURI The full namespace URI */ public static function registerNamespace($prefix, $namespaceURI) { self::$_namespaces[$prefix] = $namespaceURI; } /** * @var DOMElement */ protected $_element; /** * A string representation of the element, used when * serializing/unserializing. * * @var string */ protected $_serialized; /** * @var Horde_Xml_Element */ protected $_parentElement; /** * @var array */ protected $_children = null; /** * @var boolean */ protected $_appended = true; /** * Horde_Xml_Element constructor. * * @param DOMElement | Horde_Xml_Element | string $element The DOM element, * pre-existing Horde_Xml_Element, or XML string that we're encapsulating. */ public function __construct($element) { $this->_element = $element; $this->__wakeup(); } /** * Get a DOM representation of the element * * Returns the underlying DOM object, which can then be * manipulated with full DOM methods. * * @return DOMDocument */ public function getDom() { return $this->_element; } /** * Update the object from a DOM element * * Take a DOMElement object, which may be originally from a call * to getDom() or may be custom created, and use it as the * DOM tree for this Horde_Xml_Element. * * @param DOMElement $element */ public function setDom(DOMElement $element) { $this->_element = $this->_element->ownerDocument->importNode($element, true); } /** * Add child elements and attributes to this element from a simple * key => value hash. Keys can be: * * ElementName -> <$ElementName> will be appended with * a value of $value * #AttributeName -> An attribute $AttributeName will be * added to this element with a value * of $value * ElementName#AttributeName -> <$ElementName> will be appended to this * element if it doesn't already exist, * and have its attribute $AttributeName * set to $value * * @param $array Hash to import into this element. */ public function fromArray($array) { foreach ($array as $key => $value) { $element = null; $attribute = null; $hash_position = strpos($key, '#'); if ($hash_position === false) { $element = $key; } elseif ($hash_position === 0) { $attribute = substr($key, 1); } else { list($element, $attribute) = explode('#', $key, 2); } if (!is_null($element)) { if (!is_null($attribute)) { $this->{$element}[$attribute] = $value; } else { if (is_array($value)) { // Detect numeric arrays and treat them as multiple // instances of the same key. $firstKey = key($value); if ($firstKey === 0) { if (strpos($element, ':') !== false) { list($ns) = explode(':', $element, 2); $baseNode = $this->_element->ownerDocument->createElementNS(Horde_Xml_Element::lookupNamespace($ns), $element); } else { $baseNode = $this->_element->ownerDocument->createElement($element); } foreach ($value as $v) { $node = $baseNode->cloneNode(); if (is_array($v)) { $e = new Horde_Xml_Element($node); $e->fromArray($v); } else { $node->nodeValue = $v; $e = new Horde_Xml_Element($node); } $this->appendChild($e); } } else { $this->$element->fromArray($value); } } else { $this->$element = $value; } } } elseif (!is_null($attribute)) { $this[$attribute] = $value; } } } /** * Append a child node to this element. * * @param Horde_Xml_Element $element The element to append. */ public function appendChild(Horde_Xml_Element $element) { $element->setParent($this); $element->_ensureAppended(); $this->_expireCachedChildren(); } /** * Get an XML string representation of this element * * Returns a string of this element's XML, including the XML * prologue. * * @return string */ public function saveXml($formatted = false) { // Return a complete document including XML prologue. $doc = new DOMDocument($this->_element->ownerDocument->version, $this->_element->ownerDocument->actualEncoding); $doc->formatOutput = $formatted; $doc->appendChild($doc->importNode($this->_element, true)); return $doc->saveXML(); } /** * Get the XML for only this element * * Returns a string of this element's XML without prologue. * * @return string */ public function saveXmlFragment($formatted = false) { $oldFormatted = $this->_element->ownerDocument->formatOutput; $this->_element->ownerDocument->formatOutput = $formatted; $xml = $this->_element->ownerDocument->saveXML($this->_element); $this->_element->ownerDocument->formatOutput = $oldFormatted; return $xml; } /** * Unserialization handler; handles $this->_element being an instance of * DOMElement or Horde_Xml_Element, or parses it as an XML string. */ public function __wakeup() { if ($this->_element instanceof DOMElement) { return true; } if ($this->_element instanceof Horde_Xml_Element) { $this->_element = $this->_element->getDom(); return true; } if ($this->_serialized) { $this->_element = $this->_serialized; $this->_serialized = null; } if (is_string($this->_element)) { $doc = new DOMDocument(); $doc->preserveWhiteSpace = false; $extract = false; if (substr($this->_element, 0, 5) != ' $nsUri) { $preamble .= " xmlns:$prefix=\"$nsUri\""; } $preamble .= '>'; $this->_element = $preamble . $this->_element . ''; } $loaded = @$doc->loadXML($this->_element); if (!$loaded) { throw new Horde_Xml_Element_Exception('DOMDocument cannot parse XML: ', error_get_last()); } if ($extract) { $newDoc = new DOMDocument(); $this->_element = $newDoc->importNode($doc->documentElement->childNodes->item(0), true); } else { $this->_element = $doc->documentElement; } return true; } throw new InvalidArgumentException('Horde_Xml_Element initialization value must be a DOMElement, a Horde_Xml_Element, or a non-empty string; ' . (gettype($this->_element) == 'object' ? get_class($this->_element) : gettype($this->_element)) . ' given'); } /** * Prepare for serialization * * @return array */ public function __sleep() { $this->_serialized = $this->saveXml(); return array('_serialized'); } /** * Map variable access onto the underlying entry representation. * * Get-style access returns a Horde_Xml_Element representing the * child element accessed. To get string values, use method syntax * with the __call() overriding. * * @param string $var The property to access. * @return mixed */ public function __get($var) { $nodes = $this->_children($var); $length = count($nodes); if ($length == 1) { if ($nodes[0] instanceof Horde_Xml_Element) { return $nodes[0]; } return new Horde_Xml_Element($nodes[0]); } elseif ($length > 1) { if ($nodes[0] instanceof Horde_Xml_Element) { return $nodes; } return array_map(create_function('$e', 'return new Horde_Xml_Element($e);'), $nodes); } else { // When creating anonymous nodes for __set chaining, don't // call appendChild() on them. Instead we pass the current // element to them as an extra reference; the child is // then responsible for appending itself when it is // actually set. This way "if ($foo->bar)" doesn't create // a phantom "bar" element in our tree. if (strpos($var, ':') !== false) { list($ns, $elt) = explode(':', $var, 2); $node = $this->_element->ownerDocument->createElementNS(Horde_Xml_Element::lookupNamespace($ns), $elt); } else { $node = $this->_element->ownerDocument->createElement($var); } $node = new Horde_Xml_Element($node); $node->setParent($this); return $node; } } /** * Map variable sets onto the underlying entry representation. * * @param string $var The property to change. * @param string $val The property's new value. */ public function __set($var, $val) { if (!is_scalar($val)) { throw new InvalidArgumentException('Element values must be scalars, ' . gettype($val) . ' given'); } $this->_ensureAppended(); $nodes = $this->_children($var); if (!$nodes) { if (strpos($var, ':') !== false) { list($ns) = explode(':', $var, 2); $node = $this->_element->ownerDocument->createElementNS(Horde_Xml_Element::lookupNamespace($ns), $var, $val); $this->_element->appendChild($node); } else { $node = $this->_element->ownerDocument->createElement($var, $val); $this->_element->appendChild($node); } $this->_expireCachedChildren(); } elseif (count($nodes) > 1) { throw new Horde_Xml_Element_Exception('Cannot set the value of multiple nodes simultaneously.'); } else { $nodes[0]->nodeValue = $val; } } /** * Map isset calls onto the underlying entry representation. */ public function __isset($var) { return (boolean)$this->_children($var); } /** * Get the value of an element with method syntax. * * Map method calls to get the string value of the requested * element. If there are multiple elements that match, this will * return an array of those objects. * * @param string $var The element to get the string value of. * * @return mixed The node's value, null, or an array of nodes. */ public function __call($var, $unused) { $nodes = $this->_children($var); if (!$nodes) { return null; } elseif (count($nodes) > 1) { if ($nodes[0] instanceof Horde_Xml_Element) { return $nodes; } return array_map(create_function('$e', 'return new Horde_Xml_Element($e);'), $nodes); } else { if ($nodes[0] instanceof Horde_Xml_Element) { return (string)$nodes[0]; } else { return $nodes[0]->nodeValue; } } } /** * Remove all children matching $var. */ public function __unset($var) { $nodes = $this->_children($var); foreach ($nodes as $node) { $parent = $node->parentNode; $parent->removeChild($node); } $this->_expireCachedChildren(); } /** * Returns the nodeValue of this element when this object is used * in a string context. * * @internal */ public function __toString() { return $this->_element->nodeValue; } /** * Set the parent element of this object to another * Horde_Xml_Element. * * @internal */ public function setParent(Horde_Xml_Element $element) { $this->_parentElement = $element; $this->_appended = false; } /** * Appends this element to its parent if necessary. * * @internal */ protected function _ensureAppended() { if (!$this->_appended) { $parentDom = $this->_parentElement->getDom(); if (!$parentDom->ownerDocument->isSameNode($this->_element->ownerDocument)) { $this->_element = $parentDom->ownerDocument->importNode($this->_element, true); } $parentDom->appendChild($this->_element); $this->_appended = true; $this->_parentElement->_ensureAppended(); } } /** * Finds children with tagnames matching $var * * Similar to SimpleXML's children() method. * * @param string Tagname to match, can be either namespace:tagName or just tagName. * @return array */ protected function _children($var) { if (is_null($this->_children)) { $this->_cacheChildren(); } // Honor any explicit getters. Because Horde_Xml_Element has a __call() // method, is_callable returns true on every method name. Use // method_exists instead. $varMethod = 'get' . ucfirst($var); if (method_exists($this, $varMethod)) { $children = call_user_func(array($this, $varMethod)); if (is_null($children)) { $this->_children[$var] = array(); } elseif (!is_array($children)) { $this->_children[$var] = array($children); } else { $this->_children[$var] = $children; } } if (!isset($this->_children[$var])) { $this->_children[$var] = array(); } return $this->_children[$var]; } /** * Build a cache of child nodes. */ protected function _cacheChildren() { foreach ($this->_element->childNodes as $child) { if (!isset($this->_children[$child->localName])) $this->_children[$child->localName] = array(); $this->_children[$child->localName][] = $child; if ($child->prefix) { if (!isset($this->_children[$child->prefix . ':' . $child->localName])) $this->_children[$child->prefix . ':' . $child->localName] = array(); $this->_children[$child->prefix . ':' . $child->localName][] = $child; } } } /** * Expire cached children. */ protected function _expireCachedChildren() { $this->_children = null; } /** * Required by the ArrayAccess interface. * * @internal */ public function offsetExists($offset) { if (strpos($offset, ':') !== false) { list($ns, $attr) = explode(':', $offset, 2); return $this->_element->hasAttributeNS(Horde_Xml_Element::lookupNamespace($ns), $attr); } else { return $this->_element->hasAttribute($offset); } } /** * Required by the ArrayAccess interface. * * @internal */ public function offsetGet($offset) { if (strpos($offset, ':') !== false) { list($ns, $attr) = explode(':', $offset, 2); return $this->_element->getAttributeNS(Horde_Xml_Element::lookupNamespace($ns), $attr); } else { return $this->_element->getAttribute($offset); } } /** * Required by the ArrayAccess interface. * * @internal */ public function offsetSet($offset, $value) { if (!is_scalar($value)) { throw new InvalidArgumentException('Element values must be scalars, ' . gettype($value) . ' given'); } $this->_ensureAppended(); if (strpos($offset, ':') !== false) { list($ns) = explode(':', $offset, 2); $result = $this->_element->setAttributeNS(Horde_Xml_Element::lookupNamespace($ns), $offset, $value); } else { $result = $this->_element->setAttribute($offset, $value); } if ($result) { $this->_expireCachedChildren(); return true; } else { return false; } } /** * Required by the ArrayAccess interface. * * @internal */ public function offsetUnset($offset) { if (strpos($offset, ':') !== false) { list($ns, $attr) = explode(':', $offset, 2); $result = $this->_element->removeAttributeNS(Horde_Xml_Element::lookupNamespace($ns), $attr); } else { $result = $this->_element->removeAttribute($offset); } if ($result) { $this->_expireCachedChildren(); return true; } else { return false; } } } php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/lib/Horde/Xml/Element/000077500000000000000000000000001205617750000255565ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/lib/Horde/Xml/Element/Exception.php000066400000000000000000000005731205617750000302320ustar00rootroot00000000000000 * @license http://www.horde.org/licenses/bsd BSD * @category Horde * @package Xml_Element */ /** * @author Chuck Hagenbuch * @license http://www.horde.org/licenses/bsd BSD * @category Horde * @package Xml_Element */ class Horde_Xml_Element_Exception extends Horde_Exception_LastError { } php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/lib/Horde/Xml/Element/List.php000066400000000000000000000051701205617750000272050ustar00rootroot00000000000000 * @license http://www.horde.org/licenses/bsd BSD * @category Horde * @package Xml_Element */ /** * @author Chuck Hagenbuch * @license http://www.horde.org/licenses/bsd BSD * @category Horde * @package Xml_Element */ abstract class Horde_Xml_Element_List extends Horde_Xml_Element implements Countable, Iterator { /** * Cache of list items. * @var array */ protected $_listItems; /** * Current index on the collection of list items for the Iterator * implementation. * @var integer */ protected $_listItemIndex = 0; /** * The classname for individual list items. * @var string */ protected $_listItemClassName = 'Horde_Xml_Element'; /** * Ensure that $_listItems is populated by calling the concrete implementation's * _buildItemsCache() method. */ public function __wakeup() { parent::__wakeup(); $this->_listItems = $this->_buildListItemCache(); } /** * Called by __wakeup to cache list items. Must be implemented in the * extending class to return the array of list items. * @return array */ abstract protected function _buildListItemCache(); /** * Get the number of items in this list. * * @return integer Item count. */ public function count() { return count($this->_listItems); } /** * Required by the Iterator interface. * * @internal */ public function rewind() { $this->_listItemIndex = 0; } /** * Required by the Iterator interface. * * @internal * * @return mixed The current row, or null if no rows. */ public function current() { return new $this->_listItemClassName( $this->_listItems[$this->_listItemIndex]); } /** * Required by the Iterator interface. * * @internal * * @return mixed The current row number (starts at 0), or null if no rows */ public function key() { return $this->_listItemIndex; } /** * Required by the Iterator interface. * * @internal * * @return mixed The next row, or null if no more rows. */ public function next() { ++$this->_listItemIndex; } /** * Required by the Iterator interface. * * @internal * * @return boolean Whether the iteration is valid */ public function valid() { return (0 <= $this->_listItemIndex && $this->_listItemIndex < count($this->_listItems)); } } php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/test/000077500000000000000000000000001205617750000225755ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/test/Horde/000077500000000000000000000000001205617750000236365ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/test/Horde/Xml/000077500000000000000000000000001205617750000243765ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/test/Horde/Xml/Element/000077500000000000000000000000001205617750000257675ustar00rootroot00000000000000php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/test/Horde/Xml/Element/AllTests.php000066400000000000000000000001321205617750000302270ustar00rootroot00000000000000run(); php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/test/Horde/Xml/Element/CountTest.php000066400000000000000000000015671205617750000304410ustar00rootroot00000000000000 * @license http://www.horde.org/licenses/bsd BSD * @category Horde * @package Xml_Element * @subpackage UnitTests */ class Horde_Xml_Element_CountTest extends PHPUnit_Framework_TestCase { public function testCount() { $l = new Horde_Xml_Element_CountTest_List( '12' ); $this->assertEquals(2, $l->count(), 'List count should be 2'); } } class Horde_Xml_Element_CountTest_List extends Horde_Xml_Element_List { protected function _buildListItemCache() { $results = array(); foreach ($this->_element->childNodes as $child) { if ($child->localName == 'item') { $results[] = $child; } } return $results; } } php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/test/Horde/Xml/Element/ElementTest.php000066400000000000000000000250421205617750000307340ustar00rootroot00000000000000 * @license http://www.horde.org/licenses/bsd BSD * @category Horde * @package Xml_Element * @subpackage UnitTests */ /** * @author Chuck Hagenbuch * @license http://www.horde.org/licenses/bsd BSD * @category Horde * @package Xml_Element * @subpackage UnitTests */ class Horde_Xml_Element_ElementTest extends PHPUnit_Framework_TestCase { public function setUp() { $this->element = new Horde_Xml_Element(file_get_contents(__DIR__ . '/fixtures/Sample.xml')); $this->namespacedElement = new Horde_Xml_Element(file_get_contents(__DIR__ . '/fixtures/NamespacedSample.xml')); } public function testXml() { $el = new Horde_Xml_Element('Root'); $this->assertEquals('Root', (string)$el); $this->assertEquals('#', $el['href']); } public function testInvalidXml() { $failed = false; try { new Horde_Xml_Element('assertTrue($failed, 'Invalid XML should result in an exception'); } public function testSerialization() { $elt = new Horde_Xml_Element('Test'); $this->assertEquals('Test', $elt->title(), 'Value before serialization/unserialization'); $serialized = serialize($elt); $unserialized = unserialize($serialized); $this->assertEquals('Test', $unserialized->title(), 'Value after serialization/unserialization'); } public function testArrayGet() { $this->assertTrue(is_array($this->element->entry)); $this->assertTrue(is_array($this->namespacedElement->entry)); foreach ($this->element->entry as $entry) { $this->assertTrue($entry instanceof Horde_Xml_Element); } foreach ($this->namespacedElement->entry as $entry) { $this->assertTrue($entry instanceof Horde_Xml_Element); } } public function testOffsetExists() { $this->assertFalse(isset($this->element[-1]), 'Negative array access should fail'); $this->assertTrue(isset($this->element['version']), 'Version should be set'); $this->assertFalse(isset($this->namespacedElement[-1]), 'Negative array access should fail'); $this->assertTrue(isset($this->namespacedElement['version']), 'Version should be set'); } public function testOffsetGet() { $this->assertEquals('1.0', $this->element['version'], 'Version should be 1.0'); $this->assertEquals('1.0', $this->namespacedElement['version'], 'Version should be 1.0'); } public function testOffsetSet() { $this->element['category'] = 'tests'; $this->assertTrue(isset($this->element['category']), 'Category should be set'); $this->assertEquals('tests', $this->element['category'], 'Category should be tests'); $this->namespacedElement['atom:category'] = 'tests'; $this->assertTrue(isset($this->namespacedElement['atom:category']), 'Namespaced category should be set'); $this->assertEquals('tests', $this->namespacedElement['atom:category'], 'Namespaced category should be tests'); $this->namespacedElement['xmldata:dt'] = 'dateTime.rfc1123'; // Changing an existing index. $oldEntry = $this->element['version']; $this->element['version'] = '1.1'; $this->assertTrue($oldEntry != $this->element['version'], 'Version should have changed'); } public function testOffsetUnset() { $element = new Horde_Xml_Element(file_get_contents(__DIR__ . '/fixtures/Sample.xml')); $namespacedElement = new Horde_Xml_Element(file_get_contents(__DIR__ . '/fixtures/NamespacedSample.xml')); $this->assertTrue(isset($element['version'])); unset($element['version']); $this->assertFalse(isset($element['version']), 'Version should be unset'); $this->assertEquals('', $element['version'], 'Version should be equal to the empty string'); $this->assertTrue(isset($namespacedElement['version'])); unset($namespacedElement['version']); $this->assertFalse(isset($namespacedElement['version']), 'Version should be unset'); $this->assertEquals('', $namespacedElement['version'], 'Version should be equal to the empty string'); $namespacedElement['atom:category'] = 'tests'; $this->assertTrue(isset($namespacedElement['atom:category']), 'Namespaced Category should be set'); unset($namespacedElement['atom:category']); $this->assertFalse(isset($namespacedElement['atom:category']), 'Category should be unset'); $this->assertEquals('', $namespacedElement['atom:category'], 'Category should be equal to the empty string'); } public function testGet() { $this->assertEquals('Atom Example', (string)$this->element->title); $this->assertEquals('Atom Example', (string)$this->namespacedElement->title); $this->assertEquals('4', (string)$this->element->totalResults); $this->assertEquals('4', (string)$this->namespacedElement->totalResults); } public function testSet() { $this->element->category = 'tests'; $this->assertTrue(isset($this->element->category), 'Category should be set'); $this->assertEquals('tests', (string)$this->element->category, 'Category should be tests'); } public function testUnset() { $element = new Horde_Xml_Element(file_get_contents(__DIR__ . '/fixtures/Sample.xml')); $namespacedElement = new Horde_Xml_Element(file_get_contents(__DIR__ . '/fixtures/NamespacedSample.xml')); $this->assertTrue(isset($element->title)); unset($element->title); $this->assertFalse(isset($element->title)); $this->assertTrue(isset($namespacedElement->title)); unset($namespacedElement->title); $this->assertFalse(isset($namespacedElement->title)); } public function testIsInitialized() { $e = new Horde_Xml_Element(''); $e->author->name['last'] = 'Lastname'; $e->author->name['first'] = 'Firstname'; $e->author->name->{'Firstname:url'} = 'www.example.com'; $e->author->title['foo'] = 'bar'; if ($e->pants()) { $this->fail(' does not exist, it should not have a true value'); // This should not create an element in the actual tree. } if ($e->pants()) { $this->fail(' should not have been created by testing for it'); // This should not create an element in the actual tree. } $xml = $e->saveXML(); $this->assertFalse(strpos($xml, 'pants'), ' should not be in the xml output'); $this->assertTrue(strpos($xml, 'www.example.com') !== false, 'the url attribute should be set'); } public function testStrings() { $xml = " Using C++ Intrinsic Functions for Pipelined Text Processing http://www.oreillynet.com/pub/wlg/8356
A good C++ programming technique that has almost no published material available on the WWW relates to using the special pipeline instructions in modern CPUs for faster text processing. Here's example code using C++ intrinsic functions to give a fourfold speed increase for a UTF-8 to UTF-16 converter compared to the original C/C++ code.
Rick Jelliffe 2005-11-07T08:15:57-08:00
"; $element = new Horde_Xml_Element($xml); $this->assertTrue($element->summary instanceof Horde_Xml_Element, '__get access should return a Horde_Xml_Element instance'); $this->assertFalse($element->summary() instanceof Horde_Xml_Element, 'method access should not return a Horde_Xml_Element instance'); $this->assertTrue(is_string($element->summary()), 'method access should return a string'); $this->assertFalse(is_string($element->summary), '__get access should not return a string'); } public function testAppendChild() { $e = new Horde_Xml_Element(''); $e2 = new Horde_Xml_Element(''); $e->appendChild($e2); $this->assertEquals('', $e->saveXmlFragment()); } public function testFromArray() { $e = new Horde_Xml_Element(''); $e->fromArray(array('user' => 'Joe Schmoe', 'atom:title' => 'Test Title', 'child#href' => 'http://www.example.com/', '#title' => 'Test Element')); $this->assertEquals('Joe SchmoeTest Title', $e->saveXmlFragment()); $e = new Horde_Xml_Element(''); $e->fromArray(array('author' => array('name' => 'Joe', 'email' => 'joe@example.com'))); $this->assertEquals('Joejoe@example.com', $e->saveXmlFragment()); } public function testIllegalFromArray() { $failed = false; $e = new Horde_Xml_Element(''); try { $e->fromArray(array('#name' => array('foo' => 'bar'))); } catch (InvalidArgumentException $e) { $failed = true; } $this->assertTrue($failed); } public function testCustomGetterGet() { $xml = 'Joejoe@example.com'; $e = new Horde_Xml_Element_CustomGetter($xml); $this->assertEquals($e->author, $e->writer); $this->assertEquals($e->author->name, $e->psuedonym); } public function testCustomGetterCall() { $xml = 'Joejoe@example.com'; $e = new Horde_Xml_Element_CustomGetter($xml); $this->assertEquals($e->author(), $e->writer()); $this->assertEquals($e->author->name(), $e->psuedonym()); } } class Horde_Xml_Element_CustomGetter extends Horde_Xml_Element { public function getWriter() { return $this->author; } public function getPsuedonym() { return $this->author->name; } } php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/test/Horde/Xml/Element/IteratorTest.php000066400000000000000000000035531205617750000311370ustar00rootroot00000000000000 * @license http://www.horde.org/licenses/bsd BSD * @category Horde * @package Xml_Element * @subpackage UnitTests */ class Horde_Xml_Element_IteratorTest extends PHPUnit_Framework_TestCase { public function setUp() { $this->list = new Horde_Xml_Element_IteratorTest_List( '12' ); } public function testRewind() { $times = 0; foreach ($this->list as $i) { ++$times; } $times2 = 0; foreach ($this->list as $i) { ++$times2; } $this->assertEquals($times, $times2, 'List should have the same number of iterations multiple times through'); } public function testCurrent() { foreach ($this->list as $i) { $this->assertInstanceOf('Horde_Xml_Element', $i, 'Each list item should be an instance of Horde_Xml_Element'); break; } } public function testKey() { $keys = array(); foreach ($this->list as $k => $i) { $keys[] = $k; } $this->assertEquals($keys, array(0, 1), 'List should have keys 0 and 1'); } public function testNext() { $last = null; foreach ($this->list as $current) { $this->assertFalse($last === $current, 'Iteration should produce a new object each item'); $last = $current; } } } class Horde_Xml_Element_IteratorTest_List extends Horde_Xml_Element_List { protected function _buildListItemCache() { $results = array(); foreach ($this->_element->childNodes as $child) { if ($child->localName == 'item') { $results[] = $child; } } return $results; } } php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/test/Horde/Xml/Element/bootstrap.php000066400000000000000000000001431205617750000305130ustar00rootroot00000000000000 Atom Example This is a simple Atom Feed made by XML_Feed_Writer. 4 3 2 2005-04-25T00:00:00+02:00 1 The Item Title 2004-09-25T16:03:00+02:00 2005-12-25T16:03:00+01:00 David Coallier Testing something before releasing 2 Second item added to the builder/feeded.. 2004-01-04T00:00:00+01:00 1970-01-01T01:00:00+01:00 David Coallier Jaws project, visit the website for infos... php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/test/Horde/Xml/Element/fixtures/Sample.xml000066400000000000000000000026361205617750000316120ustar00rootroot00000000000000 Atom Example This is a simple Atom Feed made by XML_Feed_Writer. 4 3 2 2005-04-25T00:00:00+02:00 1 The Item Title 2004-09-25T16:03:00+02:00 2005-12-25T16:03:00+01:00 David Coallier Testing something before releasing 2 Second item added to the builder/feeded.. 2004-01-04T00:00:00+01:00 1970-01-01T01:00:00+01:00 David Coallier Jaws project, visit the website for infos... php-horde-xml-element-2.0.1/Horde_Xml_Element-2.0.1/test/Horde/Xml/Element/phpunit.xml000066400000000000000000000000561205617750000302010ustar00rootroot00000000000000 php-horde-xml-element-2.0.1/package.xml000066400000000000000000000205041205617750000177460ustar00rootroot00000000000000 Horde_Xml_Element pear.horde.org Horde Xml Element object An element object that can be used to provide SimpleXML-like functionality over a DOM object. The main advantage over using SimpleXML is the ability to add multiple levels of new elements in a single call, without introducing "ghost" objects. Chuck Hagenbuch chuck chuck@horde.org yes 2012-11-19 2.0.1 1.0.0 stable stable BSD-2-Clause * [mms] Use new Horde_Test layout. 5.3.0 1.7.0 Horde_Exception pear.horde.org 2.0.0 3.0.0alpha1 3.0.0alpha1 dom Horde_Test pear.horde.org 2.1.0 3.0.0alpha1 3.0.0alpha1 0.4.2 0.4.0 beta beta 2011-03-06 BSD-2-Clause * Avoid errors when a child node doesn't exist. 1.0.0alpha1 1.0.0 alpha alpha 2011-03-08 BSD-2-Clause * First alpha release for Horde 4. 1.0.0beta1 1.0.0 beta beta 2011-03-16 BSD-2-Clause * First beta release for Horde 4. 1.0.0RC1 1.0.0 beta beta 2011-03-22 BSD-2-Clause * First release candidate for Horde 4. 1.0.0RC2 1.0.0 beta beta 2011-03-29 BSD-2-Clause * Second release candidate for Horde 4. 1.0.0 1.0.0 stable stable 2011-04-06 BSD-2-Clause * First stable release for Horde 4. 1.0.1 1.0.0 stable stable 2011-11-08 BSD-2-Clause * [jan] Fix tests to work with PHPUnit 3.6. 2.0.0alpha1 1.0.0 alpha stable 2012-07-06 BSD-2-Clause * First alpha release for Horde 5. 2.0.0beta1 1.0.0 beta stable 2012-07-19 BSD-2-Clause * First beta release for Horde 5. 2.0.0 1.0.0 stable stable 2012-10-30 BSD-2-Clause * First stable release for Horde 5. 2.0.1 1.0.0 stable stable 2012-11-19 BSD-2-Clause * [mms] Use new Horde_Test layout.