我将一个长数组用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);
}
}
}
测试例
$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);
}
}
}
谢谢,将上面写死的数组如果改成如下从数据库中遍历读取读取
$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,有好几个子级,然后指定的往父子标签里面插入对应的数据……