2005.11.30 株式会社四次元データ 宮澤了祐
2.3. 属性の取得
次のようなXML文書をSAXで解析するとします。
<?xml version="1.0" encoding="euc-jp" ?> <root option1="オプション1" option2="オプション2"> <text>Hello SAX!!!</text> </root>
属性は、要素が開始した際に要素名等と同時に通知されます。
DefaultHandlerのstartElement()をオーバーライドして受け取ります。
public void startElement(String uri,String localName,String qName,Attributes attributes) { ... for(int i=0; i<attributes.getLength(); i++){ System.out.println("属性名:" + attributes.getQName(i) + "=" + attributes.getValue(i)); } ... }
uri・・・名前空間のURI
localName・・・前置修飾子を含まないローカル名
qName・・・前置修飾子を持つ修飾名
org.xml.sax.Attributesによって、属性を取得することが出来ます。
getLength()メソッドによって属性の数を取得します。
getQname(int index)メソッドによって指定した属性の名前を取得します。
getValue(int index)メソッドによって指定した属性の値を取得します。
次のように出力されていれば成功です。
… 要素開始:root 要素名:option1=オプション1 要素名:option2=オプション2 要素開始:text …
2.4. 名前空間の取得
もともとSAXは名前空間をサポートしないSAX1でしたが、現在では名前空間もサポートするSAX2が使われています。 しかし標準では名前空間のサポートはオフになっています。 名前空間を使用するには次のようにSAXParserを設定する必要があります。
SAXParserFactory sparser = SAXParserFactory.newInstance(); //名前空間の使用をオンにする sparser.setNamespaceAware(true); SAXParser parser = sparser.newSAXParser(); parser.parse(new File("sample.xml"), new SaxSample());
これにより名前空間を使用することが出来ます。 名前空間は、要素の開始イベント・終了イベントや名前空間開始イベントなどで通知されます。 イベントハンドラ内で次のメソッドを実装します。これらはContentHandlerで定義されているメソッドです。
public void startPrefixMapping(String prefix, String uri)throws SAXException { System.out.println("名前空間宣言開始:"+prefix+"("+uri+")"); } public void endPrefixMapping(String prefix) throws SAXException { System.out.println("名前空間宣言終了:"+prefix); } public void startElement(String uri,String localName,String qName,Attributes attributes){ ... System.out.println("要素開始:" + qName); System.out.println("LocalName:" + localName); //名前空間を除いた要素名 System.out.println("URI" + uri); //名前空間のURI ... } public void endElement(String uri,String localName,String qName){ ... }
prefix…名前空間名
uri…名前空間のURI
... <people:name xmlns:people="http://www.4dd.co.jp/peopleinfo">後藤茂夫</people:name> ...
このようなXMLを上記のプログラムで解析した場合、次のような結果が表示されます。
名前空間宣言開始:people(http://www.4dd.co.jp/peopleinfo) 要素開始:people:name LocalName:name URI:http://www.4dd.co.jp/peopleinfo ... 名前空間宣言終了:people