/bluebox/libraries/doctrine/lib/Doctrine/Parser/Xml.php

https://github.com/robertleeplummerjr/bluebox · PHP · 151 lines · 71 code · 16 blank · 64 comment · 17 complexity · 951cf42b4b23819e3837301615bef0e7 MD5 · raw file

  1. <?php
  2. /*
  3. * $Id: Xml.php 1080 2007-02-10 18:17:08Z jwage $
  4. *
  5. * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
  6. * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
  7. * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
  8. * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
  9. * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
  10. * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
  11. * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  12. * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  13. * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  14. * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  15. * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  16. *
  17. * This software consists of voluntary contributions made by many individuals
  18. * and is licensed under the LGPL. For more information, see
  19. * <http://www.phpdoctrine.org>.
  20. */
  21. /**
  22. * Doctrine_Parser_Xml
  23. *
  24. * @package Doctrine
  25. * @subpackage Parser
  26. * @license http://www.opensource.org/licenses/lgpl-license.php LGPL
  27. * @link www.phpdoctrine.org
  28. * @since 1.0
  29. * @version $Revision: 1080 $
  30. * @author Jonathan H. Wage <jwage@mac.com>
  31. */
  32. class Doctrine_Parser_Xml extends Doctrine_Parser
  33. {
  34. /**
  35. * dumpData
  36. *
  37. * Convert array to xml and dump to specified path or return the xml
  38. *
  39. * @param string $array Array of data to convert to xml
  40. * @param string $path Path to write xml data to
  41. * @return string $xml
  42. * @return void
  43. */
  44. public function dumpData($array, $path = null)
  45. {
  46. $data = self::arrayToXml($array);
  47. return $this->doDump($data, $path);
  48. }
  49. /**
  50. * arrayToXml
  51. *
  52. * @param string $array Array to convert to xml
  53. * @param string $rootNodeName Name of the root node
  54. * @param string $xml SimpleXmlElement
  55. * @return string $asXml String of xml built from array
  56. */
  57. public static function arrayToXml($array, $rootNodeName = 'data', $xml = null)
  58. {
  59. if ($xml === null) {
  60. $xml = new SimpleXmlElement("<?xml version=\"1.0\" encoding=\"utf-8\"?><$rootNodeName/>");
  61. }
  62. foreach($array as $key => $value)
  63. {
  64. $key = preg_replace('/[^a-z]/i', '', $key);
  65. if (is_array($value) && ! empty($value)) {
  66. $node = $xml->addChild($key);
  67. foreach ($value as $k => $v) {
  68. if (is_numeric($v)) {
  69. unset($value[$k]);
  70. $node->addAttribute($k, $v);
  71. }
  72. }
  73. self::arrayToXml($value, $rootNodeName, $node);
  74. } else if (is_int($key)) {
  75. $xml->addChild($value, 'true');
  76. } else {
  77. $value = htmlentities($value);
  78. $xml->addChild($key, $value);
  79. }
  80. }
  81. return $xml->asXML();
  82. }
  83. /**
  84. * loadData
  85. *
  86. * Load xml file and return array of data
  87. *
  88. * @param string $path Path to load xml data from
  89. * @return array $array Array of data converted from xml
  90. */
  91. public function loadData($path)
  92. {
  93. $contents = $this->doLoad($path);
  94. $simpleXml = simplexml_load_string($contents);
  95. return $this->prepareData($simpleXml);
  96. }
  97. /**
  98. * prepareData
  99. *
  100. * Prepare simple xml to array for return
  101. *
  102. * @param string $simpleXml
  103. * @return array $return
  104. */
  105. public function prepareData($simpleXml)
  106. {
  107. if ($simpleXml instanceof SimpleXMLElement) {
  108. $children = $simpleXml->children();
  109. $return = null;
  110. }
  111. foreach ($children as $element => $value) {
  112. if ($value instanceof SimpleXMLElement) {
  113. $values = (array) $value->children();
  114. if (count($values) > 0) {
  115. $return[$element] = $this->prepareData($value);
  116. } else {
  117. if ( ! isset($return[$element])) {
  118. $return[$element] = (string) $value;
  119. } else {
  120. if ( ! is_array($return[$element])) {
  121. $return[$element] = array($return[$element], (string) $value);
  122. } else {
  123. $return[$element][] = (string) $value;
  124. }
  125. }
  126. }
  127. }
  128. }
  129. if (is_array($return)) {
  130. return $return;
  131. } else {
  132. return array();
  133. }
  134. }
  135. }