首先要感谢昨天的两位朋友:jordan102和xuzuning
帖子链接:http://bbs.csdn.net/topics/390609227他们二位提供的方法测试确实可行,实在。但是在项目的开发过程中,又发现这个项目太变态了,居然还有这样的情况PHP数组:
$ar=array(
"auth"=> array(
"user"=> "user001",
"password"=> "pass001",
"context"=> "1"
),
"task"=> array(
"code"=>"0101",
"item"=>array(
"title"=>"abc",
"web"=>array(
"name"=>"baidu.com",
"ip"=>"1.2.3.4",
),
"web"=>array(
"name"=>"sina.com",
"ip"=>"1.1.1.1",
),
"confirm order"=>"1",
),
"reply_to"=>"[email protected]",
),
);
注意看里面的item节点下面,有两个web的子节点,实际上web子节点可能还有好几个,一般是在2-4个左右现在的转换程序代码如下:
$xml = simplexml_load_string('<request />');
create($ar, $xml);
$xmlData = $xml->saveXML();
echo $xmlData;function create($ar, $xml) {
foreach($ar as $k=>$v) {
if(is_array($v)) {
$x = $xml->addChild($k);
create($v, $x);
}else $xml->addChild($k, $v);
}
}这段代码比较效率比较高,但是在遇到相同名称节点的时候,就过滤了只保留最后一个节点,这样最后输出的结果变成了,注意看,把web的name值为baidu.com的就漏掉了。输出结果变成:
<?xml version="1.0"?>
<request>
<auth>
<user>user001</user>
<password>pass001</password>
<context>1</context>
</auth>
<task>
<code>0101</code>
<item>
<title>abc</title>
<web>
<name>sina.com</name>
<ip>1.1.1.1</ip>
</web>
<confirm order>1</confirm order>
</item>
<reply_to>[email protected]</reply_to>
</task>
</request>那个转换的函数,我改了又改,还是一直无法输出完整的数据,头疼……求各位前辈有什么好的方法?
帖子链接:http://bbs.csdn.net/topics/390609227他们二位提供的方法测试确实可行,实在。但是在项目的开发过程中,又发现这个项目太变态了,居然还有这样的情况PHP数组:
$ar=array(
"auth"=> array(
"user"=> "user001",
"password"=> "pass001",
"context"=> "1"
),
"task"=> array(
"code"=>"0101",
"item"=>array(
"title"=>"abc",
"web"=>array(
"name"=>"baidu.com",
"ip"=>"1.2.3.4",
),
"web"=>array(
"name"=>"sina.com",
"ip"=>"1.1.1.1",
),
"confirm order"=>"1",
),
"reply_to"=>"[email protected]",
),
);
注意看里面的item节点下面,有两个web的子节点,实际上web子节点可能还有好几个,一般是在2-4个左右现在的转换程序代码如下:
$xml = simplexml_load_string('<request />');
create($ar, $xml);
$xmlData = $xml->saveXML();
echo $xmlData;function create($ar, $xml) {
foreach($ar as $k=>$v) {
if(is_array($v)) {
$x = $xml->addChild($k);
create($v, $x);
}else $xml->addChild($k, $v);
}
}这段代码比较效率比较高,但是在遇到相同名称节点的时候,就过滤了只保留最后一个节点,这样最后输出的结果变成了,注意看,把web的name值为baidu.com的就漏掉了。输出结果变成:
<?xml version="1.0"?>
<request>
<auth>
<user>user001</user>
<password>pass001</password>
<context>1</context>
</auth>
<task>
<code>0101</code>
<item>
<title>abc</title>
<web>
<name>sina.com</name>
<ip>1.1.1.1</ip>
</web>
<confirm order>1</confirm order>
</item>
<reply_to>[email protected]</reply_to>
</task>
</request>那个转换的函数,我改了又改,还是一直无法输出完整的数据,头疼……求各位前辈有什么好的方法?
但是对方要求我的post过去的xml数据格式是这样的,我想不出别的办法了。<?xml version="1.0"?>
<request>
<auth>
<user>user001</user>
<password>pass001</password>
<context>1</context>
</auth>
<task>
<code>0101</code>
<item>
<title>abc</title>
<web>
<name>baidu.com</name>
<ip>1.2.3.4</ip>
</web>
<web>
<name>sina.com</name>
<ip>1.1.1.1</ip>
</web>
<confirm order>1</confirm order>
</item>
<reply_to>[email protected]</reply_to>
</task>
</request>
或者说php中的数组已经无法表示你最原始的数据了(至少目前你采用的这种方式无法表示)
所以请把最原始的数据贴出来,改变它的表示方式,才能解决问题。
你说的是真的,我刚刚检查了一下,在将数据转换成xml数据之前,显示数组的各项值时,那个重复了名称的变成了一项。
如果你不熟悉xml,不如通过 循环拼接字符串的 方式来生成xml,或许更简单一点。
嗯,经过各位前辈的指点,现在明白了,确实是我在创建php数组并且赋值的时候,就已经定义了相同的键值名称,导致数组有问题。我现在找了一个比较笨的解决方法,就是先定义一个文本变量$xmltext,把对方要求发送的xml数据文本复制进去,再使用替换的文本中的几个变量,替换完了,直接post过去,不需要先定义数组,再转换成xml。
嗯,经过各位前辈的指点,现在明白了,确实是我在创建php数组并且赋值的时候,就已经定义了相同的键值名称,导致数组有问题。我现在找了一个比较笨的解决方法,就是先定义一个文本变量$xmltext,把对方要求发送的xml数据文本复制进去,再使用替换的文本中的几个变量,替换完了,直接post过去,不需要先定义数组,再转换成xml。
这个也不算笨,其实就是php模板的做法,别忘了输出 header->text/xml