この前,SimpleXMLでオントロジー(.owl)を読み込めなかったと書いたところ,id:sotarokさんからレスポンスを頂きました.
レスポンスを参考に,自分なりにまとめておく.
- -
実は、XML自体はSimpleXMLElementとして読み込まれているのですが、アクセスは普通にはできないのです。なぜなら名前空間がバッチリついているからですね。
SimpleXMLで名前空間付きタグの一覧を取得する - 肉とご飯と甘いもの @ sotarok
ということで,前のエントリーで使ったオントロジー例(onto.owl)の接頭辞(rdf:,rdfs:,owl:)を除去したファイル(onto2.owl)で試してみたところ,print_rでちゃんと出力された!
<?xml version="1.0"?> <RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" xmlns:owl="http://www.w3.org/2002/07/owl#" xmlns="http://www.owl-ontologies.com/Ontology1000000000.owl#" xml:base="http://www.owl-ontologies.com/Ontology1000000000.owl"> <Class ID="Class_B"> <subClassOf> <Class ID="Class_A"/> </subClassOf> </Class> <Class ID="Class_D"> <subClassOf> <Class ID="Class_C"/> </subClassOf> </Class> </RDF>
- -
つまり、名前空間付きの子要素をとってくる場合、Childrenなどというクソわずらわしいものをつけなければいけません。これはSimpleXMLの仕様です。
SimpleXMLで名前空間付きタグの一覧を取得する - 肉とご飯と甘いもの @ sotarok
PHP: SimpleXMLElement->children - Manualを見てみると,以下のようにあるので,第一引数に名前空間(接頭辞の示すURI)を当てれば良いらしい.
SimpleXMLElement children ([ string $ns [, bool $is_prefix ] ] )
SimpleXMLElement->childrenを使ってみた.
<?php $xml = simplexml_load_file("./onto.owl"); $xml = $xml->children("http://www.w3.org/2002/07/owl#"); print_r($xml); ?>
この出力.
SimpleXMLElement Object ( [Class] => Array ( [0] => SimpleXMLElement Object ( ) [1] => SimpleXMLElement Object ( ) ) )
おー,何か出た!なるほど!
- -
また,XPathを使ってオントロジーのクラス数を数える方法も教えて頂きました.
<?php $xml = simplexml_load_file("./onto.owl"); echo count($xml->xpath("//owl:Class")); echo "\n";
おー!簡単!
今度,XPathの勉強をしてみよう.
- -
適当にまとめ.
前のエントリーでは,オントロジーファイル(.owl)を数えるのにSimpleXMLの代替案としてXMLReaderを利用したが,SimpleXMLでできないわけではなく,childrenメソッドを利用して名前空間を指定する必要があることがわかった.
id:sotarokさんにレスポンスを頂いて,大変勉強になりました.ありがとうございました.
これこそ「私塾」だー!違う?w
- -
関連エントリー:
XMLReaderを使ってオントロジーのクラス数を数える(XMLReader初体験!) - kakku blog
SimpleXMLで名前空間付きタグの一覧を取得する - 肉とご飯と甘いもの @ sotarok
XPath入門、実用例 - 素人がプログラミングを勉強していたブログ
XPath使いのための日本語チートシート 第2版