読者です 読者をやめる 読者になる 読者になる

KXml2を使う

XStreamは内部でKXml2を利用していることは既に書いた。
今回はKXml2単体での利用法を簡単に紹介しようと思う。

しかし残念ながらKXml2自体のSampleにはあまり多くのことは書かれていない。
それは次のことから不要と判断されたのだと考えている。

まず、KXml2はXmlPullをベースにしているということを思い出して欲しい。
KXml2のParserを見てみるとそのことがよくわかる。

public class KXmlParser implements XmlPullParser {

XmlPullParserインターフェースをimplementsしている。
つまりKXmlの使用法はXmlPullとほぼ同様だろうということが分かったはずだ。

次にXmlPullのSampleをあさってみると、いいものがあった。

/xmlpull_1_1_3_4c/src/java/samples/SimpleXmlPullApp.java

/* -*-             c-basic-offset: 4; indent-tabs-mode: nil; -*-  //------100-columns-wide------>|*/
// for license please see accompanying LICENSE.txt file (available also at http://www.xmlpull.org/)

import java.io.IOException;
import java.io.StringReader;

import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

/**
 * Very simple application that demonstrates basics of XMLPULL V1 API.
 *
 * @author <a href="http://www.extreme.indiana.edu/~aslom/">Aleksander Slominski</a>
 */
public class SimpleXmlPullApp
{

    public static void main (String args[])
        throws XmlPullParserException, IOException
    {
        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
        factory.setNamespaceAware(true);
        //factory.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, true);

        XmlPullParser xpp = factory.newPullParser();
        System.out.println("parser implementation class is "+xpp.getClass());

        xpp.setInput ( new StringReader ( "<foo>Hello World!</foo>" ) );
        int eventType = xpp.getEventType();
        while (eventType != XmlPullParser.END_DOCUMENT) {
            if(eventType == XmlPullParser.START_DOCUMENT) {
                System.out.println("Start document");
            } else if(eventType == XmlPullParser.END_DOCUMENT) {
                System.out.println("End document");
            } else if(eventType == XmlPullParser.START_TAG) {
                System.out.println("Start tag "+xpp.getName());
            } else if(eventType == XmlPullParser.END_TAG) {
                System.out.println("End tag "+xpp.getName());
            } else if(eventType == XmlPullParser.TEXT) {
                System.out.println("Text "+xpp.getText());
            }
            eventType = xpp.next();
        }
    }
}

なるほど、XmlPullってのはこうやってNodeを走査するんだな。

KXmlParserXmlPullParserをimplementsしているので、
上記と同様にXmlPullParser.START_DOCUMENTだとかが使えるわけだ。
あえてKXml2で書き換えるとこうなる。

public static void main (String args[]) throws XmlPullParserException, IOException {
    KXmlParser xpp = new KXmlParser();
    System.out.println("parser implementation class is "+xpp.getClass());

    xpp.setInput ( new StringReader( "<foo>Hello World!</foo>" ) );
    int eventType = xpp.getEventType();
    while (eventType != KXmlParser.END_DOCUMENT) {
        if(eventType == KXmlParser.START_DOCUMENT) {
            System.out.println("Start document");
        } else if(eventType == KXmlParser.END_DOCUMENT) {
            System.out.println("End document");
        } else if(eventType == KXmlParser.START_TAG) {
            System.out.println("Start tag "+xpp.getName());
        } else if(eventType == KXmlParser.END_TAG) {
            System.out.println("End tag "+xpp.getName());
        } else if(eventType == KXmlParser.TEXT) {
            System.out.println("Text "+xpp.getText());
        }
        eventType = xpp.next();
    }
}

# インデントが気持ち悪かったので変えた。

処理結果

parser implementation class is class org.kxml2.io.KXmlParser
Start document
Start tag foo
Text Hello World!
End tag foo

KXmlParserはFactoryクラスを必要としないのでなんだかさっぱりしていいような気がしてきた。
速度としては後続であるKXml2が勝るのだろう。
DOMやSAXを触ったことのある人なら上記Sampleで大体の感覚は掴めたことだろうと思う。