请问一个php如何将存储在数据库中的json字符串导出xml 的问题

我将一个长数组用json字符串格式保存在了数据库中的一个字段中,需要将整个数据库中的数据导出成xml文件。现在我倒是已经实现将数据库所有字段作为各自的标签导出xml了。但是这个json字符串也是作为一个整体写在一个标签里的,我要先json_decode成数组后再把数组中的key作为标签,value作为标签中的值写入,这个就不知道怎么做了……求教一下大神。

譬如如下的xml,我想将其中object中的json数组完全也做成xml格式,该如何实现?

20
jhgfkdj
per_calibration.jpg

[{“coords”:”[{“x”:428,”y”:299},{“x”:470,”y”:366}]”,”type”:”1″,”car”:””,”truck”:””,”logo”:””},{“coords”:”[{“x”:530,”y”:522},{“x”:622,”y”:556}]”,”type”:”2″,”car”:”sng712″,”truck”:””,”logo”:””},{“coords”:”[{“x”:585,”y”:435},{“x”:605,”y”:456}]”,”type”:”4″,”car”:””,”truck”:””,”logo”:”2″}]

回复讨论(解决方案)

foreach($rs as &$v){
$v[‘object’] = json_decode($v[‘object’]);
}

foreach($rs as &$v){
$v[‘object’] = json_decode($v[‘object’]);
}

谢谢,单独读取json我倒是也写出来了,只是不知道该如何把这个插入读取整个数据库的代码中。因为直接数据库导出就是遍历各字段了,怎么再把我需要的这个数组单独作为object字段中的子标签呢?

formatoutput = true;

$root = $dom->createelement(‘db_platform’);
$dom->appendchild($root);

foreach ($resarray as $res) {

$record = $dom->createelement(‘onetask’);
$root->appendchild($record);

for ($i = 0; $i < $fieldnum; $i++) { $node[$i] = $dom->createelement($dbtfield[$i]);

$node[$i]->appendchild($dom->createtextnode($res[$dbtfield[$i]]));
$record->appendchild($node[$i]);
}
}
echo $dom->savexml();
$dom->save($path);

//mysql_close();
?>

但你那 object 的内容只是形似 json 而已,并不能通过 json_decode 解码

你中的不是json格式数据,只是格式相似而已。

json_decode不能解析为数组的。

$str = ‘[{“coords”:”[{“x”:428,”y”:299},{“x”:470,”y”:366}]”,”type”:”1″,”car”:””,”truck”:””,”logo”:””},{“coords”:”[{“x”:530,”y”:522},{“x”:622,”y”:556}]”,”type”:”2″,”car”:”sng712″,”truck”:””,”logo”:””},{“coords”:”[{“x”:585,”y”:435},{“x”:605,”y”:456}]”,”type”:”4″,”car”:””,”truck”:””,”logo”:”2″}]’;
$data = json_decode($str, true);
var_dump($data); // null

改成这样就可以了

$xml= $val) {
if(!is_numeric($key)){
$xml.= php_eol.””;
}
$xml.= ( is_array($val) || is_object($val)) ? data_to_xml($val) : $val;
list($key, ) = explode(‘ ‘, $key);
if(!is_numeric($key)){
$xml.=””;
}
}
return $xml;
}

20
jhgfkdj
per_calibration.jpg

428
299
470
366
1

530
522
622
556
2
sng712

585
435
605
456
4

2

但你那 object 的内容只是形似 json 而已,并不能通过 json_decode 解码

诶……不知为什么我post过来decode是可以读出来的……
array(3) { [0]=> array(5) { [“coords”]=> string(37) “[{“x”:430,”y”:296},{“x”:470,”y”:361}]” [“type”]=> string(1) “1” [“car”]=> string(0) “” [“truck”]=> string(0) “” [“logo”]=> string(0) “” } [1]=> array(5) { [“coords”]=> string(37) “[{“x”:525,”y”:520},{“x”:625,”y”:557}]” [“type”]=> string(1) “2” [“car”]=> string(6) “sng712” [“truck”]=> string(0) “” [“logo”]=> string(0) “” } [2]=> array(5) { [“coords”]=> string(37) “[{“x”:587,”y”:435},{“x”:606,”y”:456}]” [“type”]=> string(1) “4” [“car”]=> string(0) “” [“truck”]=> string(0) “” [“logo”]=> string(1) “2” } } 但是直接写成变量就无法读取不知为何了………

然后就是如何实现直接从数据库中读取数据出来,然后把object这里面解析呢?照着你那样写成txt的确能实现最终效果,但是我如果把$xml改成我2楼那样从数据库里面读取出来的变量就不行了,请问这个如何解决?

形如 “coords”:”[{“x”:428,”y”:299},{“x”:470,”y”:366}]” 这样的串,总归是错误的

因为 ” 被嵌套了,不知正确的格式是什么

$t = array(“coords” => ‘[{“x”:428,”y”:299},{“x”:470,”y”:366}]’);
echo $s = json_encode($t), php_eol; //{“coords”:”[{\”x\”:428,\”y\”:299},{\”x\”:470,\”y\”:366}]”}
$s1 = addslashes($s);
echo $s1, php_eol; //{\”coords\”:\”[{\\\”x\\\”:428,\\\”y\\\”:299},{\\\”x\\\”:470,\\\”y\\\”:366}]\”}
var_dump(json_decode($s, 1));
/*
array(1) {
[“coords”]=>
string(37) “[{“x”:428,”y”:299},{“x”:470,”y”:366}]”
}
*/
显然你在入库时未做转义处理

$t = array(“coords” => ‘[{“x”:428,”y”:299},{“x”:470,”y”:366}]’);
echo $s = json_encode($t), php_eol; //{“coords”:”[{\”x\”:428,\”y\”:299},{\”x\”:470,\”y\”:366}]”}
$s1 = addslashes($s);
echo $s1, php_eol; //{\”coords\”:\”[{\\\”x\\\”:428,\\\”y\\\”:299},{\\\”x\\\”:470,\\\”y\\\”:366}]\”}
var_dump(json_decode($s, 1));
/*
array(1) {
[“coords”]=>
string(37) “[{“x”:428,”y”:299},{“x”:470,”y”:366}]”
}
*/
显然你在入库时未做转义处理

因为入库时的确是用$array = stripslashes($object)打断了直接post过来的$object,因为之前看着数据库里很多斜杠占空间。因此insert数据库object字段中的的确是$array……不过在php中直接$array1 = json_decode($array, true);print_r($array1);是完全可以打印出来正确的数组的…………

前端代码如下:

coords = [{x:startx,y:starty},{x:endx,y:endy}]
……
var json = {“coords”:coords, “type”:type, “car”:car, “truck”:truck, “logo”:logo};
……
object.push(obj);
n++; //写入n个对象到数组中,点击一次写入一个
document.getelementbyid(‘object’).value = json.stringify(object);

形如 “coords”:”[{“x”:428,”y”:299},{“x”:470,”y”:366}]” 这样的串,总归是错误的

因为 ” 被嵌套了,不知正确的格式是什么

后来验证一下的确正如你所说是coords数组中在中括号外面多了一对冒号,去掉后就能正确解析了……这个是怎么回事为啥会多出来一对冒号?

关键问题是我如何将读取数组的代码添加到我读取数据库的代码中?分别读取数据库导出xml、读取数组成xml的代码单独写都算是搞出来了,但是不知道怎么合在一起……

读取的时候判断下key是不是object,如果是就转数组,并且$dom->createelement等。

读取的时候判断下key是不是object,如果是就转数组,并且$dom->createelement等。

请问如我2楼源码,该在哪里添加判断条件?另外转数组是什么意思?谢谢!

你就只说 什么样的数据要转成什么样的 xml 就是了

你给个错误的 json,人家怎么去猜你要审美样的结果

你就只说 什么样的数据要转成什么样的 xml 就是了

你给个错误的 json,人家怎么去猜你要审美样的结果

啊我知道了json格式问题所在了,是第一个coords这个key的没有作为全局变量,写在函数外就解决这个问题了,那么我现在stripslashes后的object是{“object”:[{“coords”:[{“x”:428,”y”:296},{“x”:471,”y”:360}],”type”:”1″,”car”:””,”truck”:””,”logo”:””},{“coords”:[{“x”:530,”y”:525},{“x”:625,”y”:550}],”type”:”2″,”car”:”sng712″,”truck”:””,”logo”:””},{“coords”:[{“x”:584,”y”:433},{“x”:602,”y”:453}],”type”:”4″,”car”:””,”truck”:””,”logo”:”2″}]}没有错了,php中json_decode也没有问题了。ok那么请问如何在读取数据库字段导出xml的同时把这个json也作为子标签读取出来?谢谢!

测试例
$ar = array(
array(‘picid’ => 20, ‘username’ => ‘jhgfkdj’, ‘url’ => ‘per_calibration.jpg’, ‘object’ => ‘[{“coords”:[{“x”:428,”y”:299},{“x”:470,”y”:366}],”type”:”1″,”car”:””,”truck”:””,”logo”:””},{“coords”:[{“x”:530,”y”:522},{“x”:622,”y”:556}],”type”:”2″,”car”:”sng712″,”truck”:””,”logo”:””},{“coords”:[{“x”:585,”y”:435},{“x”:605,”y”:456}],”type”:”4″,”car”:””,”truck”:””,”logo”:”2″}]’ ),
array(‘picid’ => 20, ‘username’ => ‘jhgfkdj’, ‘url’ => ‘per_calibration.jpg’, ‘object’ => ‘[{“coords”:[{“x”:428,”y”:299},{“x”:470,”y”:366}],”type”:”1″,”car”:””,”truck”:””,”logo”:””},{“coords”:[{“x”:530,”y”:522},{“x”:622,”y”:556}],”type”:”2″,”car”:”sng712″,”truck”:””,”logo”:””},{“coords”:[{“x”:585,”y”:435},{“x”:605,”y”:456}],”type”:”4″,”car”:””,”truck”:””,”logo”:”2″}]’ ),
);
$dom = new domdocument(“1.0”, “utf-8”);
$root = $dom->createelement(‘db_platform’);
$dom->appendchild($root);
foreach($ar as $item) {
$record = $dom->createelement(‘onetask’);
$root->appendchild($record);
foreach($item as $k=>$v) {
if($k == ‘object’) {
$subnode = $dom->createelement($k);
$record->appendchild($subnode);
subitem(json_decode($v, 1), $subnode, $dom);
}else $node = $dom->createelement($k, $v);
$record->appendchild($node);
}
}
$dom->save(‘wt.xml’);
function subitem($ar, $root, $dom) {
foreach($ar as $k=>$v) {
if(is_numeric($k)) subitem($v, $root, $dom);
elseif(is_array($v)) {
$n = $dom->createelement($k);
$root->appendchild($n);
subitem($v, $n, $dom);
}else {
$n = $dom->createelement($k, $v);
$root->appendchild($n);
}
}
}

请问一个php如何将存储在数据库中的json字符串导出xml 的问题0

测试例
$ar = array(
array(‘picid’ => 20, ‘username’ => ‘jhgfkdj’, ‘url’ => ‘per_calibration.jpg’, ‘object’ => ‘[{“coords”:[{“x”:428,”y”:299},{“x”:470,”y”:366}],”type”:”1″,”car”:””,”truck”:””,”logo”:””},{“coords”:[{“x”:530,”y”:522},{“x”:622,”y”:556}],”type”:”2″,”car”:”sng712″,”truck”:””,”logo”:””},{“coords”:[{“x”:585,”y”:435},{“x”:605,”y”:456}],”type”:”4″,”car”:””,”truck”:””,”logo”:”2″}]’ ),
array(‘picid’ => 20, ‘username’ => ‘jhgfkdj’, ‘url’ => ‘per_calibration.jpg’, ‘object’ => ‘[{“coords”:[{“x”:428,”y”:299},{“x”:470,”y”:366}],”type”:”1″,”car”:””,”truck”:””,”logo”:””},{“coords”:[{“x”:530,”y”:522},{“x”:622,”y”:556}],”type”:”2″,”car”:”sng712″,”truck”:””,”logo”:””},{“coords”:[{“x”:585,”y”:435},{“x”:605,”y”:456}],”type”:”4″,”car”:””,”truck”:””,”logo”:”2″}]’ ),
);
$dom = new domdocument(“1.0”, “utf-8”);
$root = $dom->createelement(‘db_platform’);
$dom->appendchild($root);
foreach($ar as $item) {
$record = $dom->createelement(‘onetask’);
$root->appendchild($record);
foreach($item as $k=>$v) {
if($k == ‘object’) {
$subnode = $dom->createelement($k);
$record->appendchild($subnode);
subitem(json_decode($v, 1), $subnode, $dom);
}else $node = $dom->createelement($k, $v);
$record->appendchild($node);
}
}
$dom->save(‘wt.xml’);
function subitem($ar, $root, $dom) {
foreach($ar as $k=>$v) {
if(is_numeric($k)) subitem($v, $root, $dom);
elseif(is_array($v)) {
$n = $dom->createelement($k);
$root->appendchild($n);
subitem($v, $n, $dom);
}else {
$n = $dom->createelement($k, $v);
$root->appendchild($n);
}
}
}

请问一个php如何将存储在数据库中的json字符串导出xml 的问题1

谢谢,将上面写死的数组如果改成如下从数据库中遍历读取读取
$sql = “select * from onetask”;
$result = mysql_query($sql) or die(“invalid query: ” . mysql_error());
while ($row = mysql_fetch_array($result))
{
$arr[] = array(
‘picid’ => $row[‘picid’],
‘username’ => $row[‘username’],
‘url’ => $row[‘url’],
‘object’ => $row[‘object’]
);
}
print_r($arr);
/*array ( [0] => array ( [picid] => 21 [username] => jhgfkdj [url] => per_calibration.jpg [object] => [{“coords”:[{“x”:430,”y”:300},{“x”:472,”y”:358}],”type”:”1″,”car”:””,”truck”:””,”logo”:””},{“coords”:[{“x”:523,”y”:521},{“x”:627,”y”:552}],”type”:”2″,”car”:”sng712″,”truck”:””,”logo”:””},{“coords”:[{“x”:584,”y”:435},{“x”:605,”y”:459}],”type”:”4″,”car”:””,”truck”:””,”logo”:”2″}] ) [1] => array ( [picid] => 22 [username] => jhgfkdj [url] => per_calibration.jpg [object] => [{“coords”:[{“x”:430,”y”:300},{“x”:472,”y”:358}],”type”:”1″,”car”:””,”truck”:””,”logo”:””},{“coords”:[{“x”:523,”y”:521},{“x”:627,”y”:552}],”type”:”2″,”car”:”sng712″,”truck”:””,”logo”:””},{“coords”:[{“x”:584,”y”:435},{“x”:605,”y”:459}],”type”:”4″,”car”:””,”truck”:””,”logo”:”2″}] ) )*/
则有问题,还请您帮看一下应该怎么改,谢谢!

读取查询结果,不都这么写吗? $arr[] = $row;

你把你 #2 的 $resarray 打印出来看看,是什么样子的

你把你 #2 的 $resarray 打印出来看看,是什么样子的

谢谢,能够获取数据库中的数组了。

读取查询结果,不都这么写吗? $arr[] = $row;

再请问一下,现在我们实现的是从数据库中按顺序遍历字段并写出相应的xml标签和内容,我可否不按数据库里面的顺序,自定义xml的标签然后往标签中插入数据库中的某个值呢?

当然可以,不过既然是从数据库中读取

你就应该在查询时就指明字段的排列顺序,不要自己给自己找麻烦

当然可以,不过既然是从数据库中读取

你就应该在查询时就指明字段的排列顺序,不要自己给自己找麻烦

这是因为人家需求的xml信息跟我的数据库字段名不一样所以想这样做。他要按照他的那个xml标签名和格式排列,但是我数据库已经做好了,因此我想把他提供的xml样例的那些标签名排列好按顺序做成数组,然后select出来对应的内容插到对应的数组下标中,然后再转成xml就可以了……

select id as 序号, name as 名称 from tbl_name

这都不会?

select id as 序号, name as 名称 from tbl_name

这都不会?

啊这个会……您可能理解错我想问的地方了,就是比如说我想做一个空壳的xml,有好几个子级,然后指定的往父子标签里面插入对应的数据……

Posted in 未分类