ホームページ >バックエンド開発 >PHPチュートリアル >PHP XML 文字列の解析 (オンライン ソリューション)

PHP XML 文字列の解析 (オンライン ソリューション)

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBオリジナル
2016-06-23 14:09:301209ブラウズ

長い間 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 の構造がオンラインで提供されている例とは異なります。これを解析する方法を教えてください。

ディスカッションに返信 (解決策)

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

この行を追加します コードを試してください

1. simplexml はルート ノードを無視します
サンプル データの場合、ルート ノード order_info は無視されるため、$xml->order_infoは存在しないため、出力はありません
第 1 レベルの子ノードの値を出力します。

foreach($xml->children() as $k=>$v) {  if(empty($v)) //这里检查是否有子节点,如有就不打印。这样就跳过了 goods_infos    echo "$k $v\n";}
を次のように記述します

2. Goods_infos の下に適切な子ノードを出力する場合は、
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: Mr. Liu

city_名前:上海
District_name: 長寧
address: 8th Floor, Building 4, No. 999 Xinzhong Road
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 の下に適切な子ノードを出力する場合は、それを記述します
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のままです
詳細な回答をありがとうございます。しかし、今、問題が発生しています。simplexml_load_stringの処理前は正常ですが、処理後の出力は文字化けしており、トランスコーディングされているようです。私のプログラムファイルは gbk なので、 $xmlStr = str_replace("encoding='utf-8'", "encoding='gbk'", $xmlStr); と書きましたね。
もちろん、印刷結果は utf-8 のままです
utf-8 は xml の作業言語であるため
印刷データを 1 つずつトランスコードする必要があります
たとえば、 echo iconv('utf-6', 'gbk' 、$v );

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。