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

时间:2022-10-31 13:04:02
小弟接触php时间不长,今天遇到个问题就是解析xml字符串,内容是

<?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 不存在,所以你不会有输出
打印一级子节点的值应这样写
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


如果需要遍历所有节点,那么就需要递归
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

#4


引用 2 楼 xuzuning 的回复:
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);了

#5


不是说了吗?
当然打印的结果仍然是 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 不存在,所以你不会有输出
打印一级子节点的值应这样写
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


如果需要遍历所有节点,那么就需要递归
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

#4


引用 2 楼 xuzuning 的回复:
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);了

#5


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