ホームページ  >  記事  >  バックエンド開発  >  PHP の多次元配列を XML データ形式に変換するという昨日の問題の続きです。

PHP の多次元配列を XML データ形式に変換するという昨日の問題の続きです。

WBOY
WBOYオリジナル
2016-06-23 14:23:361113ブラウズ

まず第一に、昨日の 2 人の友人、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"=>"info@xxx.com",	),);


item ノードの下に 2 つの 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);	}}


このコードは比較的効率的ですが、同じ名前のノードが見つかった場合、フィルタリング後、 、最後のノードのみが保持されるため、最終的な出力結果は baidu.com という Web の名前の値が欠落していることに注意してください。

出力結果は次のようになります:
<?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>info@xxx.com</reply_to>	</task></request>

変換関数を何度も変更しましたが、まだ完全なデータを出力できません。頭が痛いです...

何か良い方法を教えてください。


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

配列は存在せず、同じ次元の配列内に 2 つの同一のキー名が存在することはできません。

配列は存在しません。同じ次元配列内に 2 つの同一のキー名が存在することはできません。

しかし、相手は私の投稿の 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>info@xxx.com</reply_to>	</task></request>

問題は、入場データとは何ですか?文章?ジソン?それは間違いなくあなたが示した配列ではありません

既製の array2xml クラスと json2xml クラスがたくさんあります

問題は、エントリ データが何なのかということです。文章?ジソン?それは間違いなくあなたが示した配列ではありません

既製の array2xml クラスと json2xml クラスがたくさんあります


私はあなたが言及したこれら 2 つのクラスを使用したことがありません、私は XML を初めて使用します

エントリデータは json ではなく xml 形式です。

相手には私が投稿したXML形式のデータを受け取るインターフェースがあり、その技術文書のスクリーンショットを見ると、その後ろにもnserverが2つ書いてあります。私はそれが間違っているはずだと思います

現在の問題は、配列を XML に変換する問題ではありませんが、配列を生成するときにすでに問題が発生しています。
言い換えれば、php の配列は元のデータを表現できなくなります (少なくとも、現在使用している方法では表現できません)
したがって、問題を解決するには、元のデータを投稿し、その表現を変更してください。

現在の問題は、配列を XML に変換する際の問題ではなく、その配列を生成するときの問題です。
言い換えれば、php の配列は元のデータを表現できなくなります (少なくとも、現在使用している方法では表現できません)
したがって、問題を解決するには、元のデータを投稿し、その表現を変更してください。

先ほど確認したところ、データをXMLデータに変換する前に、配列の値を表示するときに、名前が重複しているものが1つの項目になりました。

相手の入り口ではなく、あなたの入り口です。同じキーを持つことは不可能です

XML はそれほど複雑ではないようです。中国語や特殊文字のエスケープは必要ありません。XML に慣れていない場合は、文字列をループして連結して XML を生成することをお勧めします。もう少し簡単かもしれません。

相手の入り口ではなく、あなたの入り口です。同じキーを持つことは不可能です


さて、先輩の指導の後、それは確かに私がphp配列を作成して値を割り当てたときに定義したキー値の名前と同じであり、配列に問題が発生していることがわかりました。

今、私は愚かな解決策を見つけました。それは、最初にテキスト変数 $xmltext を定義し、相手が送信する必要がある XML データテキストをコピーし、置換が完了した後、置換されたテキストでいくつかの変数を使用することです。直接投稿すると、最初に配列を定義してから XML に変換する必要はありません。

XML はそれほど複雑ではないようです。中国語や特殊文字のエスケープは必要ありません。XML に慣れていない場合は、文字列をループして連結することによって XML を生成する方が簡単かもしれません。


はい、私は今この方法を使用しています


相手の入り口ではなく、あなたの入り口です。同じキーを持つことは不可能です

さて、先輩の指導の後、それは確かに私がphp配列を作成して値を割り当てたときに定義したキー値の名前と同じであり、配列に問題が発生していることがわかりました。

今、私は愚かな解決策を見つけました。それは、最初にテキスト変数 $xmltext を定義し、相手が送信する必要がある XML データテキストをコピーし、置換が完了した後、置換されたテキストでいくつかの変数を使用することです。直接投稿すると、最初に配列を定義してから XML に変換する必要はありません。
これは愚かなことではなく、実際には PHP テンプレートの方法です。ヘッダー>テキスト/xml を出力することを忘れないでください

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