php xml转json_PHP XML 与 JSON 相互转换

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 输出:

$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 . '

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);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值