モンスターカレンダー

« 2004年9月 »
123456789101112131415161718192021222324252627282930

xmllib また使ってみる

| コメント(0)

よく使うような使いかた。

あるXMLデータを加工する。DOMです。




appleredfood


pikminredcreature?


pikminyellowcreature?


goldenkiwiyellowfood


lemonyellowfood


cucumbergreenfood

--------------------------------------------------------------------------------

(1)とりあえず全データを配列に入れる。

■スクリプト

require_once("XML/Parser.php");
define("CHAR_CODE", "EUC-JP");
 echo "";
 echo '';
 echo "";
 test1();
 echo "";
 echo "";

//すべてよみこみ、配列化
function test1(){

$doc = domxml_open_file("xmltest31.xml",
DOMXML_LOAD_DONT_KEEP_BLANKS); //不要な空白等除去

$color_nodes = $ctx->xpath_eval("/alldata/data");
$elements = $color_nodes->nodeset;
foreach ($elements as $data) {
 $nodes = $data->child_nodes();
 foreach ($nodes as $node) {
 $array[$node->tagname] = $node->get_content();
}
 $data_array[] = $array;
}

print_r($data_array);
}

■実行結果

Array (
[0] => Array ( [name] => apple [color] => red [kind] => food )
[1] => Array ( [name] => pikmin [color] => red [kind] => creature? )
[2] => Array ( [name] => pikmin [color] => yellow [kind] => creature? )
[3] => Array ( [name] => golden kiwi [color] => yellow [kind] => food )
[4] => Array ( [name] => lemon [color] => yellow [kind] => food )
[5] => Array ( [name] => cucumber [color] => green [kind] => food )
)

--------------------------------------------------------------------------------

(2)特定の条件のデータを配列に入れる。
XPathを使用して絞りこむ

■スクリプト

function test2(){

$doc = domxml_open_file("xmltest31.xml",
DOMXML_LOAD_DONT_KEEP_BLANKS); //不要な空白等除去

$ctx = xpath_new_context($doc);

$target = 'red';
$color_nodes = $ctx->xpath_eval("/alldata/data/color[text()='" . $target . "']"); //color="red"を抽出
$elements = $color_nodes->nodeset;
foreach ($elements as $element) {
 $node = $element->parent_node(); //親=dataノード取得
 $nodes = $node->child_nodes();
 foreach ($nodes as $val) {
  $array[$val->tagname] = $val->get_content();
 }
$data_array[] = $array;
}
print_r($data_array);
}

■実行結果

Array (
[0] => Array ( [name] => apple [color] => red [kind] => food )
[1] => Array ( [name] => pikmin [color] => red [kind] => creature? )
)

--------------------------------------------------------------------------------

(3)特定の条件のデータを配列に入れる:日本語データの場合

いろいろ試してみたところ、UTF-8で比較する必要があるようだ。
DOM関数を使用した時点でUTF-8となってしまう?
どこかで指定できるのかとマニュアル見てみたが、分からず。




りんごあかたべもの


ピクミンあかいきもの?


ピクミンきいろいきもの?


ゴールデンキウイきいろたべもの


レモンきいろたべもの


きゃべつみどりたべもの

■スクリプト

function test3(){

$doc = domxml_open_file("xmltest31.xml",
DOMXML_LOAD_DONT_KEEP_BLANKS); //不要な空白等除去

$ctx = xpath_new_context($doc);

$target = 'きいろ';
$target = mb_convert_encoding($target, "UTF-8", "EUC-JP"); //文字コード変換
$color_nodes = $ctx->xpath_eval("/alldata/data/color[text()='" . $target . "']");

$elements = $color_nodes->nodeset;
foreach ($elements as $element) {
 $node = $element->parent_node(); //親=dataノード取得
 $nodes = $node->child_nodes();
 foreach ($nodes as $val) {
//内部文字コードに変換
  $tag = mb_convert_encoding($val->tagname, "EUC-JP", "UTF-8");
  $cont = mb_convert_encoding($val->get_content(), "EUC-JP", "UTF-8");
  $array[$tag] = $cont;
 }
$data_array[] = $array;
}
print_r($data_array);
}

■実行結果

Array (
[0] => Array ( [name] => ピクミン [color] => きいろ [kind] => いきもの? )
[1] => Array ( [name] => ゴールデンキウイ [color] => きいろ [kind] => たべもの )
[2] => Array ( [name] => レモン [color] => きいろ [kind] => たべもの ) )
)

コメントする