2025年3月24日 星期一 甲辰(龙)年 月廿三 设为首页 加入收藏
rss
您当前的位置:首页 > 计算机 > 编程开发 > PHP

PHP XML 与 JSON 相互转换

时间:02-14来源:作者:点击数:42

XML 转 JSON

以下代码演示了如何将一个 xml 文件的数据转换为 Json 格式数据:

  • function xmlToArray($xml, $options = array()) {
  • $defaults = array(
  • 'namespaceSeparator' => ':',//you may want this to be something other than a colon
  • 'attributePrefix' => '@', //to distinguish between attributes and nodes with the same name
  • 'alwaysArray' => array(), //array of xml tag names which should always become arrays
  • 'autoArray' => true, //only create arrays for tags which appear more than once
  • 'textContent' => '$', //key used for the text content of elements
  • 'autoText' => true, //skip textContent key if node has no attributes or child nodes
  • 'keySearch' => false, //optional search and replace on tag and attribute names
  • 'keyReplace' => false //replace values for above search values (as passed to str_replace())
  • );
  • $options = array_merge($defaults, $options);
  • $namespaces = $xml->getDocNamespaces();
  • $namespaces[''] = null; //add base (empty) namespace
  • //get attributes from all namespaces
  • $attributesArray = array();
  • foreach ($namespaces as $prefix => $namespace) {
  • foreach ($xml->attributes($namespace) as $attributeName => $attribute) {
  • //replace characters in attribute name
  • if ($options['keySearch']) $attributeName =
  • str_replace($options['keySearch'], $options['keyReplace'], $attributeName);
  • $attributeKey = $options['attributePrefix']
  • . ($prefix ? $prefix . $options['namespaceSeparator'] : '')
  • . $attributeName;
  • $attributesArray[$attributeKey] = (string)$attribute;
  • }
  • }
  • //get child nodes from all namespaces
  • $tagsArray = array();
  • foreach ($namespaces as $prefix => $namespace) {
  • foreach ($xml->children($namespace) as $childXml) {
  • //recurse into child nodes
  • $childArray = xmlToArray($childXml, $options);
  • list($childTagName, $childProperties) = each($childArray);
  • //replace characters in tag name
  • if ($options['keySearch']) $childTagName =
  • str_replace($options['keySearch'], $options['keyReplace'], $childTagName);
  • //add namespace prefix, if any
  • if ($prefix) $childTagName = $prefix . $options['namespaceSeparator'] . $childTagName;
  • if (!isset($tagsArray[$childTagName])) {
  • //only entry with this key
  • //test if tags of this type should always be arrays, no matter the element count
  • $tagsArray[$childTagName] =
  • in_array($childTagName, $options['alwaysArray']) || !$options['autoArray']
  • ? array($childProperties) : $childProperties;
  • } elseif (
  • is_array($tagsArray[$childTagName]) && array_keys($tagsArray[$childTagName])
  • === range(0, count($tagsArray[$childTagName]) - 1)
  • ) {
  • //key already exists and is integer indexed array
  • $tagsArray[$childTagName][] = $childProperties;
  • } else {
  • //key exists so convert to integer indexed array with previous value in position 0
  • $tagsArray[$childTagName] = array($tagsArray[$childTagName], $childProperties);
  • }
  • }
  • }
  • //get text content of node
  • $textContentArray = array();
  • $plainText = trim((string)$xml);
  • if ($plainText !== '') $textContentArray[$options['textContent']] = $plainText;
  • //stick it all together
  • $propertiesArray = !$options['autoText'] || $attributesArray || $tagsArray || ($plainText === '')
  • ? array_merge($attributesArray, $tagsArray, $textContentArray) : $plainText;
  • //return node as array
  • return array(
  • $xml->getName() => $propertiesArray
  • );
  • }

使用实例

  • $xmlNode = simplexml_load_file('example.xml');
  • $arrayData = xmlToArray($xmlNode);
  • echo json_encode($arrayData);

JSON 转 XML

以下代码将 JSON 数据格式作为 XML 输出:

  • <?php
  • $json = stream_get_contents(STDIN);
  • $data = @json_decode($json, false);
  • if (!is_array($data) && !is_object($data)) {
  • echo 'ERROR: Invalid JSON given' . PHP_EOL;
  • exit(1);
  • }
  • class Exporter
  • {
  • private $root = 'document';
  • private $indentation = ' ';
  • // TODO: private $this->addtypes = false; // type="string|int|float|array|null|bool"
  • public function export($data)
  • {
  • $data = array($this->root => $data);
  • echo '<?xml version="1.0" encoding="UTF-8">';
  • $this->recurse($data, 0);
  • echo PHP_EOL;
  • }
  • private function recurse($data, $level)
  • {
  • $indent = str_repeat($this->indentation, $level);
  • foreach ($data as $key => $value) {
  • echo PHP_EOL . $indent . '<' . $key;
  • if ($value === null) {
  • echo ' />';
  • } else {
  • echo '>';
  • if (is_array($value)) {
  • if ($value) {
  • $temporary = $this->getArrayName($key);
  • foreach ($value as $entry) {
  • $this->recurse(array($temporary => $entry), $level + 1);
  • }
  • echo PHP_EOL . $indent;
  • }
  • } else if (is_object($value)) {
  • if ($value) {
  • $this->recurse($value, $level + 1);
  • echo PHP_EOL . $indent;
  • }
  • } else {
  • if (is_bool($value)) {
  • $value = $value ? 'true' : 'false';
  • }
  • echo $this->escape($value);
  • }
  • echo '</' . $key . '>';
  • }
  • }
  • }
  • private function escape($value)
  • {
  • // TODO:
  • return $value;
  • }
  • private function getArrayName($parentName)
  • {
  • // TODO: special namding for tag names within arrays
  • return $parentName;
  • }
  • }
  • $exporter = new Exporter();
  • $exporter->export($data);
方便获取更多学习、工作、生活信息请关注本站微信公众号城东书院 微信服务号城东书院 微信订阅号
推荐内容
相关内容
栏目更新
栏目热门