Android下のXml解析技術(一)、SAX解析Xmlファイル

9850 ワード

原文の住所:http://blog.csdn.net/ichliebephone/article/details/5971533
Xmlファイルにはたくさんの解析方法があります。J 2 EEを勉強する中でDOM、DOM 4 j、SAX、JDOMなどたくさん勉強しました。
DOM:ファイルオブジェクトモデル(Document Object Model、DOMと略称する)は、W 3 Cグループが推奨する処理拡張可能な標準プログラミングインターフェースです。
JDOM:JDOMはXMLを使用したユニークなJavaツールバッグで、XMLの高速開発に用いられます。 アプリケーション。その設計はJava言語の文法ひいては意味を含む。
DOM 4 j:dom 4 jはJavaのXML APIで、jdomに似ています。XMLファイルを読むためのものです。dom 4 jは非常に優れたJava XML APIであり、優れた性能、強力で使いやすいという特徴を持っています。同時に、オープンソースコードのソフトウェアでもあります。SourceForgeで見つけられます。
SAX:SAX(Simple) API for XML)はイベント駆動によるものです。 XML 処理モードは、主にイベントソースおよびイベントプロセッサ(またはモニタ)に関して動作する。
Androidでは、SAX、DOM、Pullの3つの解析方法が一般的です。そして、AndroidではXML解析に対するサポートがかなり強いので、AndroidとXML解析に関するカバンを見てください。
1. android.sax
これはAndroidです SDKが提供するSAX解析のパッケージは、具体的なElement設定の傍受を行うことができるので、よりロバスト性が高い。
2. android.util.Xml
これはAndroid.utilカバンの中の一つです。XML関連の実用的な方法を提供しています。しかも全部publicです。 static形式の種類の方法は、直接クラス名で呼び出すことができます。
3. javax.xml.parsers
これは元々Javaを使っています。 SDKは、xml処理のためのAPI、すなわちJAXP(Java)に使用される。 API for XML Processing)は主にSAXとDOM方式でXMLを解析する工場方法を提供しています。
4. org.w 3 c.dom
Dockment、Elementなど、DOM方式のXML解析に関する具体的なインターフェースを提供します。
5. org.xml.sax
XMLReaderおよび4つの処理用のHandlerなどの具体的なSAX方式解析XML関連のインターフェースを提供します。
6. org.xml.sax.helpers
SAXの4つの処理用のHandlerインターフェースを実現したDefault Handlerなどの解析に便利なSAXのヘルプクラスを提供します。XMLフィルタXMLFilterのXMLFilterImplやXMLReaderの作成に便利なXMLReader Factoryなどです。
7. org.xmlpull.v 1
Pull方式解析XMLのインターフェースXml Pull ParsserやXMLを書くためのXml Serializerなどが提供されます。
以上はAndroidが提供したXML読み書き関連のカバンです。この学習シリーズではこれらのカバンの機能を具体的に紹介し、これらのSAX解析を順次使用してXML地震データの読み取りを完了したDemoの例を紹介します。
この三つの解析方法の第一種類を見てみます。SAX解析技術
SAX(Simple) API for XML)はイベント駆動によるものです。 XML 処理モードは、主にイベントソースおよびイベントプロセッサ(またはモニタ)に関して動作する。イベントを発生することができるオブジェクトはイベントソースと呼ばれ、イベントに応答することができるオブジェクトはイベントプロセッサと呼ばれる。イベントソースおよびイベントプロセッサは、イベントソースにおけるイベントプロセッサ登録方法によって接続される。このように、イベントソースがイベントを発生した後(XML要素の開始と終了など)、イベントプロセッサ(多くのコールバック関数で構成されている)の対応する処理方法を呼び出すと、一つのイベントが処理されます。もちろん、イベントソースがイベントプロセッサ内の特定の方法を呼び出すと、イベントプロセッサに対応するイベントの状態情報(すなわち、コールバック関数内のパラメータ)が渡され、イベントプロセッサは、イベント情報に基づいて自分の行動を決定することができる。
ここでよく使われるイベントハンドバック関数には、ドキュメント処理用のものがあります。
文書開始:startDcument()
文書終了:endDockment()
XML元素開始:startElement(String) uri String local Name String qName,Attributes atributes)
XML要素の内容:characters(char[] ch、 要点 start、 要点 length)
XML元素終了:endElement(String) uri String local Name String qName)
解析エラーのコールバック関数error(SAXP arseException)もあります。 exception)など
Androidシステムでは、元のJavaである2つのSAX解析のパケットが提供されている。 SDKにはXML処理用のAPIがあります。 API for XML Processingは、SAXとDOMの両方に関するAPIを含んでいます。関連内容はjavax.xml.parsersにあります。もう一つはAndroidを経由したものです。 SDKはその後のsaxパッケージを包装し、関連内容はカバンandroid.saxにあります。
この部分はまずJavaを勉強します。 SDKではSAX方式でXMLを処理する方法があります。javax.xml.parsersパッケージの中で、SAXに関するのは2つの種類です。SAX解析器工場SAXXarserFactoryとSAX解像器SAXXXarser。SAXarserFactoryにはset方法とget方法があります。いくつかの構成オプションを設定して取得できます。ここで最も重要なの呼び出しがあります。解析器SAXarserクラスの例を作成します。SAXPクラスは最下層のSAX解像器(org.xml.sax.XMLReader)を包装しました。 SAXXarserの例では、XML解析を行うためにPArse方法を呼び出すと、実際には、下層の具体的なorg.xml.saxパケットのXMLReaderを呼び出すことができます。SAXPアラサーの例は、getXMLReader()方法を呼び出すことによって、下層のXMLReaderのインスタンスを得ることもできます。
以上の紹介を通して、org.xml.saxカバンは下の階の具体的なSAX解析関連の内容を担当しており、上の階のjavax.xml.parsersパッケージにSAX解析器などの関連呼び出しを提供していることが分かりました。
SAXインターフェースでは、イベントのソースはorg.xml.saxパッケージのXMLReaderであり、パース()方法によってXMLドキュメントの解析を開始し、ドキュメントの内容に従ってイベントを発生します。イベントプロセッサはorg.xml.saxパッケージのContentHandler、DDDDDDDDDDDDDDDHlar、ErrHandler、およびErr Handlerです。 EnttityResolaverの4つのインターフェースは、それぞれ事件のソースが解析中に発生する様々な種類のイベント(主にContentHandlerであり、文書の内容に関連するイベントを処理する)を処理します。 イベントソースXMLReaderとこの4つのイベントプロセッサとの接続は、XMLReaderにおける対応するイベントプロセッサ登録方法set***()によって行われる。
したがって、具体的な手順は以下の通りです。
1. 1つ以上のプロセッサインターフェースを実現します。 Error Handler DDDandler ,or Enttity Resover)
2. XMLReaderクラスのインスタンスを作成します。
3. 新しいXMLReaderの例では、大量のset***()を通じて 方法は、イベントプロセッサの例を登録する。
4. XMLReaderのparse()メソッドを呼び出して、ドキュメントの起動解析を処理します。
 
以上の部分の紹介はorg.xml.saxパッケージで提供されるSAX解析の関連インターフェースを使用する時の使い方ですが、一般的によく使われています。javax.xml.parsersパッケージを使用して提供されるSAX工場類SAXRPser Factoryを作成し、org.xml.sax.helpersパッケージを継承するための具体的なDeullクラスを作成します。Default HandlerクラスはSAXのContentHandler,DDDDDandler,Error Handlerを提供しています。 EnttityResolaverの4つのインターフェースのすべてのコールバック方法は、デフォルトの空実装ですので、このクラスを引き継いで、必要なコールバック関数だけをカバーしてもいいです。その後、SAXarserのインスタンスのパースメソッドを呼び出して解析します。解析するためのxmlデータの形式はInputStreamsとなります。 Files URLs and SAX InputSourcesなどの4つの形態。
実現ステップは上記と同様である:
1. Default Handlerを継承するクラスで必要なコールバック関数を書き換えます。
2. SAXarserの例を作成します。
3. SAXP arser例パーズメソッド起動解析
このような簡単なxmlファイルtest.xmlを解析します。
<?xml version="1.0" encoding="UTF-8"?>
<persons>
	<person id="1">
		<name>Lucy</name>
		<age>15</age>
	</person>
	<person id="2">
		<name>Tim</name>
		<age>20</age>
	</person>
</persons>
xmlファイルのノードは、要素ノードとテキストノードの2つに分けられます。
元素ノードとは<>の要素のことです。
テキストノードとは、要素と要素の間のテキストのことです。
xmlファイルを解析する時は、最初から一歩ずつ解析して、自分に興味があるトリガーイベントは、コールバック方法の中にあるものを書いて処理します。
一、Default Handlerを継承するクラスで必要なコールバック関数を書き換えます。
普通は5つの方法を書き換える必要があります。
startDcument()  :ドキュメントのコールバック方法を開始します。
endDocument():ドキュメントの戻り方を終了します。
startElement(String uri、String local Name、String qName、Attributes atributes):元素ノードのコールバック方法を開始します。
パラメータ:
uri−名前空間URIは、要素に名前空間URIがない場合、または名前空間処理が実行されていない場合、空の文字列となる。
localName−ローカル名(プレフィクスなし)は、名前空間処理が実行されていない場合、空の文字列となる。
qName−定義された名称(プレフィックス付き)は、指定された名前が利用できない場合は、空の文字列となる。
attributes-要素の属性に付加されます。属性がない場合は、空のAttributesオブジェクトになります。
endElement(String uri,String local Name,String qName)
パラメータ:uri−名前空間URIは、要素に名前空間URIがない場合、または名前空間処理が実行されていない場合、空の文字列となる。
localName−ローカル名(プレフィクスなし)は、名前空間処理が実行されていない場合、空の文字列となる。
qName−定義された名称(プレフィックス付き)は、指定された名前が利用できない場合、空の文字列となります。
characters(char[]ch,int start,int length)

ch-文字。
start-文字配列の開始位置。
length-文字配列から使用する文字数。
実際の動作では、必要に応じて、APIでより多くの方法を参照する。
package com.tao.xmlpaser;

import java.util.ArrayList;
import java.util.List;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SaxHandler extends DefaultHandler {
    private String tag;//        
    private List<Person> persons;
    private Person person;

    //          
    @Override
    public void startDocument() throws SAXException {
        super.startDocument();
        persons = new ArrayList<Person>();
    }

    //          
    @Override
    public void endDocument() throws SAXException {
        super.endDocument();
    }

    //          
    //  :         ,             ,           ,      ,            ,
     @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes)
            throws SAXException {
        super.startElement(uri, localName, qName, attributes);
        if ("person".equals(qName)) {
            person = new Person();
            person.setId(new Integer(attributes.getValue(0)));
        } else if ("name".equals(qName)) {
            tag = qName;
        } else if ("age".equals(qName)) {
            tag = qName;
        }
    }

    //          
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        super.endElement(uri, localName, qName);
        tag = null;
        if ("person".equals(qName)) {
            persons.add(person);
            person = null;
        }
    }

    //            
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        super.characters(ch, start, length);
        if (tag == null)
            return;
        if ("name".equals(tag)) {
            person.setName(new String(ch, start, length));
        }
        if ("age".equals(tag)) {
            person.setAge(new Integer(new String(ch, start, length)));
        }
    }

    //        
    public List<Person> getResult() {
        return persons;
    }
}
Person Mode類
package com.tao.xmlparse;


public class Person {
	private int id;
	private String name;
	private int age;
	public Person() {
	}
	
	public Person( String name, int age) {
		this.name = name;
		this.age = age;
	}
	
	public Person(int id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
}
2. SAXarserの例を作成します。    3. SAXP arser例パーズメソッド起動解析
public void saxParseXml() throws ParserConfigurationException, SAXException, IOException{
    	//     ,  SAXParser  
    	SAXParserFactory factory=SAXParserFactory.newInstance();
    	SAXParser parser=factory.newSAXParser();
    	//  xml      
    	InputStream inputStream=getClass().getClassLoader().getResourceAsStream("test.xml");
    	//   hanlder  
    	SaxHandler handler=new SaxHandler();
    	//    
    	parser.parse(inputStream, handler);
    	//      ,    
    	List<Person> persons=handler.getResult();
    	for (Person p:persons) {
			System.out.println(p.getId()+"--"+p.getName()+"---"+p.getAge());
		}
    }
Saxで解析する際に最も重要なポイントは、それらの「ノード」間の空白を無視しないことです。