L2J

久々にN鯖を回復させようとしてみたら、元々DBだったものがかなりXMLに・・・。
ということで、ガリガリXMLを手書きするのは嫌なので、プログラムを書いてみた。

<?php
$itemDir = "items";

define("NORMAL"        , "0");
define("MULTIPLICATION", "1");
define("ADDITION"      , "2");
define("SUBTRACTION"   , "3");
define("DIVISION"      , "4");

//ディレクトリ内のファイル名を1つずつを取得
$res_dir = opendir( './' . $itemDir );
while( $file_name = readdir( $res_dir ) ) if(strstr($file_name,'.xml')) $fileNameArray[] = $file_name;
closedir( $res_dir );

//ファイルごとのループ
foreach($fileNameArray as $fileName){
	echo $fileName . "===========\n";
	$file = $fileName;
	$xml = new SimpleXMLElement($itemDir.'/'. $fileName, null, true);
	//ここからどんどこ追加------------------------------------------------------
	$searchIdArray = array(729, 730,947,948,951,952,955,956,959,960,6569,6570,6571,6572,6573,6574,6575,6576,6577,6578,
		731,732,949,950,953,954,957,958,961,962);
	changeIsStackableFromIdArray($xml, $searchIdArray, "true");
	//ここまでどんどこ追加------------------------------------------------------
	$xml -> asXML( 'result/' . $file ); 
}

// 検索IDからpriceの変更を実行する
function changePriceFromIdArray($xml, $searchIdArray, $price){
	changeKeyFromIdArray($xml, $searchIdArray, "price", $price);
}

// 検索IDからpriceの変更を掛け算で実行する(multiplication)
function changeMultiplicationPriceFromIdArray($xml, $searchIdArray, $multiplicationValue){
	changeKeyFromIdArray($xml, $searchIdArray, "price", $multiplicationValue, MULTIPLICATION);
}

// 検索IDからis_destroyableの変更を実行する
function changeIsDestroyableFromIdArray($xml, $searchIdArray, $flag){
	changeKeyFromIdArray($xml, $searchIdArray, "is_destroyable", $flag);
}
// 検索IDからweightの変更を実行する
function changeWeightFromIdArray($xml, $searchIdArray, $weight){
	changeKeyFromIdArray($xml, $searchIdArray, "weight", $weight);
}

// 検索IDからis_sellableの変更を実行する
function changeIsSellableFromIdArray($xml, $searchIdArray, $flag){
	changeKeyFromIdArray($xml, $searchIdArray, "is_sellable", $flag);
}

// 検索IDからis_dropableの変更を実行する
function changeIsDropableFromIdArray($xml, $searchIdArray, $flag){
	changeKeyFromIdArray($xml, $searchIdArray, "is_dropable", $flag);
}

// 検索IDからis_tradableの変更を実行する
function changeIsTradableFromIdArray($xml, $searchIdArray, $flag){
	changeKeyFromIdArray($xml, $searchIdArray, "is_tradable", $flag);
}

// 検索IDからis_depositableの変更を実行する
function changeIsDepositableFromIdArray($xml, $searchIdArray, $flag){
	changeKeyFromIdArray($xml, $searchIdArray, "is_depositable", $flag);
}
// 検索IDからis_stackableの変更を実行する
function changeIsStackableFromIdArray($xml, $searchIdArray, $flag){
	changeKeyFromIdArray($xml, $searchIdArray, "is_stackable", $flag);
}

// 検索IDからcrystal_countの変更を実行する
function changeCrystalCountFromIdArray($xml, $searchIdArray, $count){
	changeKeyFromIdArray($xml, $searchIdArray, "crystal_count", $count);
}

function changeKeyFromIdArray($xml,$searchIdArray, $key, $value, $changeFormat = NORMAL){
	foreach($xml->item as $items){
		//検索IDArrayに入っているか
		if(in_array($items->attributes()->id , $searchIdArray)){
			$elementFoundFlag = false;
			$itemName = $items->attributes()->name;
			$itemType = $items->attributes()->type;
			$itemId   = $items->attributes()->id;
			//要素を走査
			foreach($items->set as $sets){
				//keyの項目か
				if($sets["name"] == $key){
					echo  "[$itemType\t$itemId\t$itemName]  $key : " . $sets["val"] . "";
					switch ($changeFormat){
					case (NORMAL):
						$sets["val"] = $value;
						echo $sets["val"] . " に変換\n";
						break;
					case (MULTIPLICATION):
						echo $value. "で乗算して";
						$sets["val"] *= $value;
						echo $sets["val"] . " に変換\n";
						break;
					case (ADDITION):
						echo $value. "で加算して";
						$sets["val"] += $value;
						break;
					case (SUBTRACTION):
						echo $value. "で減算して";
						$sets["val"] -= $value;
						break;
					case (DIVISION):
						echo $value. "で除算(÷)して";
						$sets["val"] /= $value;
						break;
					}
					$elementFoundFlag = true;
				}
			}
			//要素が存在しない場合
			if(!$elementFoundFlag){
				switch ($changeFormat){
				case (NORMAL):
					echo "情報: id[" . $items->attributes()->id . "]には" .  $key . "が存在しない様子。適切に要素を追加しました。";
					break;
				case (MULTIPLICATION):
					echo  "警告: id[" . $items->attributes()->id . "]には" .  $key . "が存在しない様子。" . $value. "で乗算する予定の値を、ひとまずそのまま入れておきました。";
					break;
				case (ADDITION):
					echo "警告: id[" . $items->attributes()->id . "]には" .  $key . "が存在しない様子。" . $value. "で加算する予定の値を、ひとまずそのまま入れておきました。";
					break;
				case (SUBTRACTION):
					echo "警告: id[" . $items->attributes()->id . "]には" .  $key . "が存在しない様子。" . $value. "で減算する予定だったので、ひとまず0を入れておきました。";
					$value = 0;
					break;
				case (DIVISION):
					echo "警告: id[" . $items->attributes()->id . "]には" .  $key . "が存在しない様子。" . $value. "で除算する予定だったので、ひとまず0を入れておきました。絶対修正してください。";
					$value = 0;
					break;
				}
				$items->addChild("set name=\"$key\" val=\"$value\"");
				echo "\n";

			}
		}
	}
}