ある xml ファイルには、「おそらく」要素が A、B、C、D の 4 種類あり、要素 A には、A1、A2、A3、A4 の属性、要素 B には、B1、B2、B3、B4 の属性、要素 C と要素 D にはそれぞれ、属性 C1 と D1 がある、と「思われます」。
しかし、これ以外にも要素や属性があるかもしれません。
そこで、何かしらの方法を使って、XML ファイルから要素と属性の一覧を取得したいと思います。
重複するものは無視して、一意のものだけを一覧にしたものがほしいと思っています。
こうした XML ファイルは合計で 20 ファイルくらいあり、サイズはまちまちで数百 KB から 150 MB までです。
ただし、含まれている主要な要素と属性は同じだと思います。
150 MB が流石に大きすぎるのであれば、何らかの方法で分割は可能です。
PHP 5.3.0、秀丸、EXCEL 2007、XMLEDITOR.NET を使っています。
そのほかフリーソフトや簡単なスクリプトでこの一覧を取得する方法を教えてください。
phpマニュアルにあるSAXのサンプルコードをベースに、1つのxmlを読み込み、単純に要素とそれに対する属性を一意になるように取得し、最後に"要素,属性1,属性2...."のようなCSVを出力するサンプルを作ってみました。
phpはほぼ初めてなんで、変な部分があるかもしれませんが、これを適当にいじって複数ファイルに対応させたりすれば何とかなるんじゃないですか?
<?php $file = "test.xml"; $map_array = array(); function startElement($parser, $name, $attrs) { global $map_array; if (isset($map_array[$name])) { $tmp_attrs = $map_array[$name]; foreach(array_keys($attrs) as $aname){ if (!isset($tmp_attrs[$aname])) { $tmp_attrs[$aname] = $attrs[$aname]; } } $map_array[$name] = $tmp_attrs; } else { $map_array[$name] = $attrs; } } function endElement($parser, $name) {} $xml_parser = xml_parser_create(); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, true); xml_set_element_handler($xml_parser, "startElement", "endElement"); if (!($fp = fopen($file, "r"))) { die("could not open XML input"); } while ($data = fread($fp, 4096)) { if (!xml_parse($xml_parser, $data, feof($fp))) { die(sprintf("XML error: %s at line %d", xml_error_string(xml_get_error_code($xml_parser)), xml_get_current_line_number($xml_parser))); } } xml_parser_free($xml_parser); foreach (array_keys($map_array) as $name) { $list = ""; $attrs = $map_array[$name]; foreach(array_keys($attrs) as $aname) { $list = "$list,$aname"; } print "$name$list\n"; } ?>
ありがとうございます。
求めているような形になりました。
今回の質問とは異なりますが、ちょっといじって、違うことにも役立ちました。