热搜:NVER node 开发 php

PHP的xml字符串解析(在线求解)

2024-09-11 17:45:01
PHP的xml字符串解析(在线求解)

小弟接触php时间不长,今天遇到个问题就是解析xml字符串,内容是

<?xml version='1.0' encoding='utf-8'?>1381796968813817969688021-54485454刘先生上海长宁新中路999号4栋8楼送货前电话联系,谢谢。515411515423


$xml=simplexml_load_string($xmlStr);foreach($xml->order_info as $item) {	oreach($item as $k=>$v)	echo "$k $v\n";}

代码是网上找的,但用到我的这个上面行不通,我试了一下,一方面是因为字符串有汉字,另一方面是xml结构跟网上提供的示例不一样,请问亲们这个要怎么解析呢


回复讨论(解决方案)

 header('Content-Type: text/xml');


加上这行代码试试

1、simplexml 会忽略根节点
对于你的示例数据,根节点 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 的

如果需要遍历所有节点,那么就需要递归

function show_child($xml) {  foreach($xml->children() as $tag=>$item) {    if($item) show_child($item);    else echo "$tag: $item\n";  }}show_child($xml);
user_name: 13817969688
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

1、simplexml 会忽略根节点
对于你的示例数据,根节点 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 的
非常感谢你的详细解答,但现在遇到个问题是,我的xml文件在simplexml_load_string处理之前是正常的,但处理之后输出发现乱码了,而且转码好像转不过来,我的程序文件是gbk的,所以我加过$xmlStr = str_replace("encoding='utf-8'", "encoding='gbk'", $xmlStr);了

不是说了吗?
当然打印的结果仍然是 utf-8 的
因为 utf-8 是 xml 的工作语言
你需要逐个的对待打印的数据进行转码
比如 echo iconv('utf-6', 'gbk', $v);