XMLプロセスを解析71 SAX

分析手順と原則

  1. // XMLタグに基づいて、対応するエンティティクラスを作成します
  2. // SAXファクトリを作成します。
  3. //ファクトリからSAXパーサのインスタンスを取得します。
  4. ハンドラのサブクラスと新しいを作成します//
  5. //このサブクラスをオーバーライドする:エンティティクラスのタグ書き込み内容に対応
  6. //解析

その後、唯一の行く一度、一度解析されたSAX解析xmlファイル、解決順序上から下へ、ライン解像度、解像度タグによってライン、その後、タグの内容(解析されるとしても、空白、改行)を解析し、解像度タグ。

我々は簡単にstartElement()およびendElement()メソッド内で何かを行うことができますので、SAXは、開始と終了タグを識別することができます。

文字()メソッドは、ブランクも読み出されたとしても、(一対のタグの間に内容を読んでいない)は、2つの隣接するラベル間の内容を読み取るために使用されます。たとえば:</人> </人物>、我々は(トリムを使用することができます)空白文字を除去することができます

、ラベルを格納する変数タグ名を使用して文字に現在のタグ名に対応することができる(タグで便宜上)方法、およびデータを読み取ります。

ケース・プレゼンテーション

使用次の分析SAXのXML、結果はエンティティクラスに保存されています。

<?xml version = "1.0"エンコード= "UTF-8"?> 
<人物> 
	<人> 
		<名前>周杰伦</名前> 
		<ファン> 3000ワット</ファン> 
	</人> 
	<人> 
		<名前>蔡依林</名前> 
		<ファン> 2000ワット</ファン> 
	</人> 
</人物>

  

コード

これはメソッドがオーバーライドされたメソッドではありませんカスタムメソッドであることを示しています。

エンティティクラス:

パッケージ_20191224_review。
/ ** 
 * person.xml中の人标签的实体
* / 
publicクラス人{ 
	プライベート文字列名; 
	プライベート文字列のファン。
	パブリック文字列のgetName(){ 
		戻り名。
	} 
	公共ボイドのsetName(文字列名){ 
		this.name =名。
	} 
	パブリック文字列getFans(){ 
		リターンファン。
	} 
	公共ボイドsetFans(文字列ファン){ 
		this.fans =ファン。
	} 
}

  

解決プロセス:

パッケージ_20191224_review。

インポートにjava.io.IOException; 
輸入はjava.util.ArrayList; 
インポートするjava.util.Iterator; 
輸入はjava.util.List; 

輸入javax.xml.parsers.ParserConfigurationExceptionの。
輸入javax.xml.parsers.SAXParser。
輸入javax.xml.parsers.SAXParserFactory; 

輸入org.xml.sax.Attributes。
輸入org.xml.sax.SAXException。
輸入org.xml.sax.helpers.DefaultHandler。

/ ** 
 * SAX 
 * XML解析
 *代码:36 
 * / 
publicクラスTestXmlSAX { 
	公共の静的な無効メイン(文字列[]引数)スローParserConfigurationException、SAXExceptionのは、IOException { 
		//从工厂中获取SAX 
		のSAXParserFactory工場= SAXParserFactory.newInstance()。 
		//からSAXパーサを取得
		SAXParserの= factory.newSAXParserパーサを(); 
		//作成ハンドラサブクラスとインスタンス化
		PersonH​​andler新しい新しいPersonH​​andlerハンドラ=(); 
		//オーバーライド必要なメソッド
		//解析
		parser.parse(にThread.currentThread()getContextClassLoader()getResourceAsStream( "_ 20191224_review / Person.xml")、ハンドラ...); 
		//データ取得しよう
		(handler.showを); 
	} 
} 

クラスPersonH​​andler {たDefaultHandlerは延び
	プライベートリストの<person>人、
	プライベートタグ文字列、
	個人個人、
	公共PersonH​​andler(){ 
		;新しい新しい=のArrayList <>()人
	} 
	@Override
	公共ボイドstartDocument()は、SAXExceptionのは{スロー 
	ます。public void文字(文字[] CH、int型開始、 
		System.out.printlnは( "文書を解析開始します"); 
	}
	@Override 
	公共ボイドのstartElement(文字列URI、ローカル名文字列、文字列QNameは、属性を属性)SAXExceptionの{スロー
		タグ= QNAMEと、
		System.out.println( "元素开始- >" +タグ)。
		(tag.equals( "人物")){もし
			人=新しい人(); 
		} 
	} 
	@Override 
	公共ボイドするendElement(文字列URI、ローカル名文字列、文字列QNAME)はSAXExceptionの{スロー
		タグ= QNAMEと、
		System.out.println( "元素结束- >" + QNAME)。
		IF(tag.equals( "人物")){ 
			persons.add(人)。
		} 
	} 
	@Override
		IF(。content.trim()のisEmpty()){ 
			リターン。
		}
		文字列の内容=新しい文字列(CH、開始、長さ)。
		System.out.println( "タグ"+タグ+"内容:" +コンテンツ)。
		IF(tag.equals( "名前")){ 
			person.setName(コンテンツ)。
		} 
		(tag.equals( "ファン")){もし
			person.setFans(コンテンツ)。
		} 
	} 
	公共ボイドショー(){ 
		イテレータそれ= persons.iterator()。
		一方、(it.hasNext()){ 
			人物P =(人物)it.next(); 
			System.out.println( "名字:" + p.getName()+ "粉丝数:" + p.getFans())。
		} 
	} 
}

  

 

業績

おすすめ

転載: www.cnblogs.com/Scorpicat/p/12090833.html