StAX--JDK内蔵XML解析器


ミレニアム年頃、XMLが多くのJava開発者の前に初めて登場したとき、XMLファイルを解析する方法は2つあります.SAX解析器は実際にプログラマによってイベントに対して一連のコールバックメソッドを呼び出す大型ステータスマシンである.DOM解析器はXMLドキュメント全体をメモリに追加し、ツリーを形成するために接続された離散オブジェクトに切断します.このツリーでは、ドキュメント全体のXML Infoset表現について説明します.この2つの解析器には欠点があります.SAXは低レベルで、使用できません.DOMの代価が大きすぎて、特に大きなXMLファイルに対して--木全体が巨大なものになりました.
幸いなことに、Java開発者はXMLファイルを解析する3つ目の方法を見つけ、ドキュメントを「ノード」にモデリングすることで、ドキュメントストリームから1つずつ取り出し、チェックし、処理または破棄することができます.これらの「ノード」の「ストリーム」は、SAXとDOMの中間地帯を提供し、「Streaming API for XML」、またはStAXと呼ばれる.(この略語は、新しいAPIと元のSAX解析器を区別するために使用され、これと同名である.)StAX解析器は、javax.xml.streamパッケージにJDKにパッケージされた.
StAXを使用するのは簡単です.XMLEventReaderをインスタンス化し、フォーマットの良いXMLファイルに移動し、ノードを一度に引き出して表示します(通常はwhileループを使用します).たとえば、リスト1には、Antコンストラクションスクリプトのすべてのターゲットが列挙されています.

				
import java.io.*;
import javax.xml.namespace.QName;
import javax.xml.stream.*;
import javax.xml.stream.events.*;
import javax.xml.stream.util.*;

public class Targets
{
    public static void main(String[] args)
        throws Exception
    {
        for (String arg : args)
        {
            XMLEventReader xsr = 
                XMLInputFactory.newInstance()
                    .createXMLEventReader(new FileReader(arg));
            while (xsr.hasNext())
            {
                XMLEvent evt = xsr.nextEvent();
                switch (evt.getEventType())
                {
                    case XMLEvent.START_ELEMENT:
                    {
                        StartElement se = evt.asStartElement();
                        if (se.getName().getLocalPart().equals("target"))
                        {
                            Attribute targetName = 
                                se.getAttributeByName(new QName("name"));
                            // Found a target!
                            System.out.println(targetName.getValue());
                        }
                        break;
                    }
                    // Ignore everything else
                }
            }
        }
    }
}

StAX解析器は、すべてのSAXコードとDOMコードを置き換えません.しかし、いくつかの任務を容易にするに違いない.特に、XMLドキュメント全体のツリー構造を知る必要のないタスクを完了するのに便利です.
イベント・オブジェクト・レベルが高すぎて使用できない場合は、StAXにもXMLStreamReaderに低レベルのAPIがあります.リーダーが役に立たないかもしれませんが、StAXにはXMLEventWriterがあります.同様に、XML出力用のXMLStreamWriterクラスもあります.