]> granicus.if.org Git - php/commitdiff
- Add new example
authorMarcus Boerger <helly@php.net>
Sat, 29 Oct 2005 20:38:30 +0000 (20:38 +0000)
committerMarcus Boerger <helly@php.net>
Sat, 29 Oct 2005 20:38:30 +0000 (20:38 +0000)
ext/spl/examples/xml_xpath_tree.php [new file with mode: 0755]

diff --git a/ext/spl/examples/xml_xpath_tree.php b/ext/spl/examples/xml_xpath_tree.php
new file mode 100755 (executable)
index 0000000..781ac12
--- /dev/null
@@ -0,0 +1,122 @@
+<?php
+
+/** @file   xml_xpath_tree.php
+ * @brief   XML XPath Tree example
+ * @ingroup Examples
+ * @author  Marcus Boerger
+ * @date    2003 - 2005
+ * @version 1.0
+ *
+ * Usage: php xml_tree.php \<file\> \<xpath\> [\<len\>]
+ *
+ * Simply specify the xml file to tree with parameter \<file\>.
+ *
+ * The second parameter is a xpath expression to be evaluated.
+ *
+ * The third parameter allows to output a maximum of \<len\> characters of
+ * the element or attribute value.
+ */
+
+if ($argc < 3) {
+       echo <<<EOF
+Usage: php ${_SERVER['PHP_SELF']} <file>
+
+Displays a graphical tree for the elements in <file> <xpath> [<len>].
+
+<file>  The file for which to generate the tree graph.
+<xpath> An XPath expression to evaluate.
+<len>   Max length to display for attribute and element content (default: 0).
+
+
+EOF;
+       exit(1);
+}
+
+if (!class_exists("RecursiveTreeIterator", false)) require_once("recursivetreeiterator.inc");
+
+class SimpleXmlStructure extends AppendIterator implements RecursiveIterator
+{
+       function __construct($xml)
+       {
+               parent::__construct();
+               if (!is_null($xml))
+               {
+                       $xml = is_object($xml) ? $xml : $xml = simplexml_load_file($xml, 'SimpleXmlIterator');
+                       $this->append($xml);
+                       $attr = $xml->attributes();
+                       if ($attr)
+                       {
+                               $this->append($attr);
+                       }
+               }
+       }
+
+       function key()
+       {
+               return ($this->getIteratorIndex() ? '@' : '') . parent::key();
+       }
+
+       function hasChildren()
+       {
+               return $this->getInnerIterator()->hasChildren()
+                       || !$this->getIteratorIndex();
+       }
+
+       function getChildren()
+       {
+               $inner = $this->getInnerIterator();
+               return $this->getIteratorIndex()
+                    ? $inner->getChildren()
+                    : new SimpleXmlStructure($inner->getChildren());
+       }
+       
+       function current()
+       {
+               global $len;
+               
+               if ($len)
+               {
+                       $val = substr(parent::current(), 0, $len);
+                       $nws = preg_replace("/([\r\n]|\s\s+)/e", " ", $val);
+                       return ($this->getIteratorIndex() ? '= ' : ': ') . $nws;
+               }
+               else
+               {
+                       return '';
+               }
+       }
+}
+
+class SimpleXMLXPathResult extends RecursiveArrayIterator
+{
+       function __construct($file, $xpath)
+       {
+               $xml = @simplexml_load_file($file, 'SimpleXmlIterator');
+               parent::__construct($xml ? $xml->xpath($xpath) : NULL);
+       }
+
+       function current()
+       {
+               return '';
+       }
+
+       function hasChildren()
+       {
+               return true;
+       }
+
+       function getChildren()
+       {
+               return new SimpleXmlStructure(parent::current());
+       }
+}
+
+$len = isset($argv[3]) ? $argv[3] : 0;
+$xml = new SimpleXMLXPathResult($argv[1], $argv[2]);
+$it  = new RecursiveTreeIterator($xml, RecursiveTreeIterator::BYPASS_CURRENT);
+foreach($it as $c=>$v)
+{
+       echo "$c$v\n";
+}
+
+?>
\ No newline at end of file