さてJAXP (Java API for XML Processing) のおさらいだ

JavaXML操作するときはJAXPを使います。たしか、XMLパーサ (XercesとかCrimson?)をとっかえたりできるんすよね。これ。まー今回はデフォルトのパーサで行きますが。

XML読み込んで、Documentオブジェクト (XML文書全体を表すオブジェクト) を生成するまでに、

  • DocumentBuilderFactoryを生成
  • DocumentBuilderを生成
  • ファイル、URIなどを指定してXMLファイルを読み、Documentオブジェクトの生成

などなどと長くなりますが。パーサごとに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>

次は、他の機能も調べてきます。あと、実際にアプリケーションを作る上で必要な事項も調べとくか。英語読まないといけないけど。