<?xml version='1.0' encoding='utf-8'?>
<order_info>
<user_name>13817969688</user_name>
<mobile>13817969688</mobile>
<tel>021-54485454</tel>
<customer_name>刘先生</customer_name>
<city_name>上海</city_name>
<district_name>长宁</district_name>
<address>新中路999号4栋8楼</address>
<customer_word>送货前电话联系,谢谢。</customer_word>
<goods_infos>
<good>
<goods_id>51541</goods_id>
<goods_amount>1</goods_amount>
</good>
<good>
<goods_id>51542</goods_id>
<goods_amount>3</goods_amount>
</good>
</goods_infos>
</order_info>
用
$xml=simplexml_load_string($xmlStr);
foreach($xml->order_info as $item) {
oreach($item as $k=>$v)
echo "$k $v\n";
}
代码是网上找的,但用到我的这个上面行不通,我试了一下,一方面是因为字符串有汉字,另一方面是xml结构跟网上提供的示例不一样,请问亲们这个要怎么解析呢
5 个解决方案
#1
header('Content-Type: text/xml');
加上这行代码试试
#2
1、simplexml 会忽略根节点
对于你的示例数据,根节点 order_info 被忽略,所以 $xml->order_info 不存在,所以你不会有输出
打印一级子节点的值应这样写
2、如果是打印 goods_infos 下的 good 子节点,则写作
3、如果你的程序文件不是 utf-8 的,还应该有
$xmlStr = str_replace("encoding='utf-8'", "encoding='gbk'", $xmlStr);
即将字符集改为真实的字符集
当然打印的结果仍然是 utf-8 的
对于你的示例数据,根节点 order_info 被忽略,所以 $xml->order_info 不存在,所以你不会有输出
打印一级子节点的值应这样写
foreach($xml->children() as $k=>$v) {
if(empty($v)) //这里检查是否有子节点,如有就不打印。这样就跳过了 goods_infos
echo "$k $v\n";
}
2、如果是打印 goods_infos 下的 good 子节点,则写作
foreach($xml->goods_infos->good as $item) {
foreach($item as $k=>$v)
echo "$k $v\n";
}
3、如果你的程序文件不是 utf-8 的,还应该有
$xmlStr = str_replace("encoding='utf-8'", "encoding='gbk'", $xmlStr);
即将字符集改为真实的字符集
当然打印的结果仍然是 utf-8 的
#3
如果需要遍历所有节点,那么就需要递归
mobile: 13817969688
tel: 021-54485454
customer_name: 刘先生
city_name: 上海
district_name: 长宁
address: 新中路999号4栋8楼
customer_word: 送货前电话联系,谢谢。
goods_id: 51541
goods_amount: 1
goods_id: 51542
goods_amount: 3
function show_child($xml) {user_name: 13817969688
foreach($xml->children() as $tag=>$item) {
if($item) show_child($item);
else echo "$tag: $item\n";
}
}
show_child($xml);
mobile: 13817969688
tel: 021-54485454
customer_name: 刘先生
city_name: 上海
district_name: 长宁
address: 新中路999号4栋8楼
customer_word: 送货前电话联系,谢谢。
goods_id: 51541
goods_amount: 1
goods_id: 51542
goods_amount: 3
#4
非常感谢你的详细解答,但现在遇到个问题是,我的xml文件在simplexml_load_string处理之前是正常的,但处理之后输出发现乱码了,而且转码好像转不过来,我的程序文件是gbk的,所以我加过$xmlStr = str_replace("encoding='utf-8'", "encoding='gbk'", $xmlStr);了
#5
不是说了吗?
当然打印的结果仍然是 utf-8 的
因为 utf-8 是 xml 的工作语言
你需要逐个的对待打印的数据进行转码
比如 echo iconv('utf-6', 'gbk', $v);
当然打印的结果仍然是 utf-8 的
因为 utf-8 是 xml 的工作语言
你需要逐个的对待打印的数据进行转码
比如 echo iconv('utf-6', 'gbk', $v);
#1
header('Content-Type: text/xml');
加上这行代码试试
#2
1、simplexml 会忽略根节点
对于你的示例数据,根节点 order_info 被忽略,所以 $xml->order_info 不存在,所以你不会有输出
打印一级子节点的值应这样写
2、如果是打印 goods_infos 下的 good 子节点,则写作
3、如果你的程序文件不是 utf-8 的,还应该有
$xmlStr = str_replace("encoding='utf-8'", "encoding='gbk'", $xmlStr);
即将字符集改为真实的字符集
当然打印的结果仍然是 utf-8 的
对于你的示例数据,根节点 order_info 被忽略,所以 $xml->order_info 不存在,所以你不会有输出
打印一级子节点的值应这样写
foreach($xml->children() as $k=>$v) {
if(empty($v)) //这里检查是否有子节点,如有就不打印。这样就跳过了 goods_infos
echo "$k $v\n";
}
2、如果是打印 goods_infos 下的 good 子节点,则写作
foreach($xml->goods_infos->good as $item) {
foreach($item as $k=>$v)
echo "$k $v\n";
}
3、如果你的程序文件不是 utf-8 的,还应该有
$xmlStr = str_replace("encoding='utf-8'", "encoding='gbk'", $xmlStr);
即将字符集改为真实的字符集
当然打印的结果仍然是 utf-8 的
#3
如果需要遍历所有节点,那么就需要递归
mobile: 13817969688
tel: 021-54485454
customer_name: 刘先生
city_name: 上海
district_name: 长宁
address: 新中路999号4栋8楼
customer_word: 送货前电话联系,谢谢。
goods_id: 51541
goods_amount: 1
goods_id: 51542
goods_amount: 3
function show_child($xml) {user_name: 13817969688
foreach($xml->children() as $tag=>$item) {
if($item) show_child($item);
else echo "$tag: $item\n";
}
}
show_child($xml);
mobile: 13817969688
tel: 021-54485454
customer_name: 刘先生
city_name: 上海
district_name: 长宁
address: 新中路999号4栋8楼
customer_word: 送货前电话联系,谢谢。
goods_id: 51541
goods_amount: 1
goods_id: 51542
goods_amount: 3
#4
非常感谢你的详细解答,但现在遇到个问题是,我的xml文件在simplexml_load_string处理之前是正常的,但处理之后输出发现乱码了,而且转码好像转不过来,我的程序文件是gbk的,所以我加过$xmlStr = str_replace("encoding='utf-8'", "encoding='gbk'", $xmlStr);了
#5
不是说了吗?
当然打印的结果仍然是 utf-8 的
因为 utf-8 是 xml 的工作语言
你需要逐个的对待打印的数据进行转码
比如 echo iconv('utf-6', 'gbk', $v);
当然打印的结果仍然是 utf-8 的
因为 utf-8 是 xml 的工作语言
你需要逐个的对待打印的数据进行转码
比如 echo iconv('utf-6', 'gbk', $v);