さてJAXP (Java API for XML Processing) のおさらいだ
JavaでXML操作するときはJAXPを使います。たしか、XMLパーサ (XercesとかCrimson?)をとっかえたりできるんすよね。これ。まー今回はデフォルトのパーサで行きますが。
XML読み込んで、Documentオブジェクト (XML文書全体を表すオブジェクト) を生成するまでに、
などなどと長くなりますが。パーサごとにDocumentBuilderが用意されてるから、こんなめんどくさくなってるんですね。デザパタのFactoryMethodパターンでしたっけ?
// DocumentBuilderFactory インスタンスを取得 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // DocumentBuilder を取得 DocumentBuilder builder = factory.newDocumentBuilder(); // 指定したXMLファイルを読み込んで、documentオブジェクトを返す Document doc = builder.parse(new InputSource(filepath));
あとは、documentオブジェクトからNodeを取り出して、XMLのノードを探索していきながら、ノード名を抽出していきます。
// 深さ優先でノードを辿る for (Node ch = node.getFirstChild(); ch != null; ch = ch.getNextSibling()) { // ノードが要素ノード(?)のときだけ処理する (テキストノードの場合もあるため) if (ch.getNodeType() == Node.ELEMENT_NODE) { // ノードごとの処理 }
ノード名を取り出したら、その名前でクラスを作り、サブクラスに加えてくと。やり方は前の日記も参照してください。
最後にファイルに出力して終わりと。
んで、出力してみたのが、これと。OWLモデルへクラスを追加してく順番とは違う、クラス階層になってますね。順番を保持してないのかな。実際のとこは、順番保持してなくても何も問題はないんですが。
<?xml version="1.0"?> <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:xsd="http://www.w3.org/2001/XMLSchema#" 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/unnamed.owl#" xml:base="http://www.owl-ontologies.com/unnamed.owl"> <owl:Ontology rdf:about=""/> <owl:Class rdf:ID="juice"/> <owl:Class rdf:ID="florida"> <rdfs:subClassOf> <owl:Class rdf:ID="cocktail"/> </rdfs:subClassOf> </owl:Class> <owl:Class rdf:ID="screwdriver"> <rdfs:subClassOf rdf:resource="#cocktail"/> </owl:Class> <owl:Class rdf:ID="lemon_juice"> <rdfs:subClassOf rdf:resource="#juice"/> </owl:Class> <owl:Class rdf:ID="liqueur"/> <owl:Class rdf:ID="lime_juice"> <rdfs:subClassOf rdf:resource="#juice"/> </owl:Class> <owl:Class rdf:ID="limoncello"> <rdfs:subClassOf rdf:resource="#liqueur"/> </owl:Class> <owl:Class rdf:ID="orange_juice"> <rdfs:subClassOf rdf:resource="#juice"/> </owl:Class> <owl:Class rdf:ID="spirits"/> <owl:Class rdf:ID="kahlua"> <rdfs:subClassOf rdf:resource="#liqueur"/> </owl:Class> <owl:Class rdf:ID="vodka"> <rdfs:subClassOf rdf:resource="#spirits"/> </owl:Class> <owl:Class rdf:ID="grapefruit_juice"> <rdfs:subClassOf rdf:resource="#juice"/> </owl:Class> <owl:Class rdf:ID="gin"> <rdfs:subClassOf rdf:resource="#spirits"/> </owl:Class> <owl:Class rdf:ID="gimlet"> <rdfs:subClassOf rdf:resource="#cocktail"/> </owl:Class> </rdf:RDF>
次は、他の機能も調べてきます。あと、実際にアプリケーションを作る上で必要な事項も調べとくか。英語読まないといけないけど。