あるプログラムで RDF/XML の更新部分を抜き出すプログラムが必要だったので作成。
diff_rdfの
第一引数には最新版のRDFのファイル名を、
第二引数には古い版のRDFのファイル名を
入れてください。
<?php /********************************************************** * diff_rdf * @poochin - http://www13.atpages.jp/llan/ * LastUpdate: 2010-04-21 * * License: MIT or new BSD *********************************************************/ /** * diff_rdf * get newer entry! * ja(新しいエントリーを取得!) * * Argument * file1 -- new rdf file name * file2 -- old rdf file name * ja(file1 -- 新しいRDFファイル) * ja(file2 -- 古いRDFファイル) * * return * difference items as array * ja(差分のitemを配列にして返す) */ function diff_rdf($file1, $file2) { /** * to compare rdf:li, parse and pick out file1, file2 * ja(items > rdf:li を比較する為に file1, file2 を展開する) */ $xml1 = simplexml_load_file($file1); $namespaces1 = $xml1->getNamespaces(); $list1 = current($xml1->xpath('//rdf:Seq'))->children($namespaces1['rdf'])->li; $list1_array = asXMLinArray_($list1); $items1 = getLists_($xml1->item); $xml2 = simplexml_load_file($file2); $namespaces2 = $xml2->getNamespaces(); $list2 = current($xml2->xpath('//rdf:Seq'))->children($namespaces2['rdf'])->li; $list2_array = asXMLinArray_($list2); // $items2 = getLists_($xml2->item); // items2 isn't neccesary // get different // ja(差分を取得) $diff = array_diff($list1_array, $list2_array); // returning array, use diff's key to get items of file1 // 差分のキーと共通する items1 を返す return array_intersect_key($items1, $diff); } /** * getLists(simpleXML-Object) * * using installation, loop and get all xml children. * * ja(イタレーションを利用してsimpleXMLオブジェクト の * 配列を取得する) */ function getLists_($xml_list) { $lists = array(); foreach ($xml_list as $item) { $lists[] = $item; } return $lists; } /** * asXMLinArray(Array include simpleXML-Object) * * xml children to Array using asXML() * * ja(simpleXMLの子要素に asXML() をかけて配列にする) */ function asXMLinArray_($xml_array) { $lists = array(); foreach ($xml_array as $item) { $lists[] = $item->asXML(); } return $lists; } /*--------------------------------------------------------- Sample Code ---------------------------------------------------------*/ $f1 = 'test1.rdf.xml'; $f2 = 'test2.rdf.xml'; print_r(diff_rdf ($f1, $f2));
多分このコードだけで使い方は分かるんじゃないかな、と思います。
変更2010-04-21:複数 diff_rdf を呼び出すと、関数の再定義が行われてしまうという問題を抱えていたので習性
追伸2010-10-10:更新したものを github にあげました [github.com]
0 件のコメント:
コメントを投稿