2005-12-05 [長年日記]

_ [java.xb][kuro.nova]StAX、使ってみた。[日記]

 ElementタグとComponentタグをそれぞれ別々に解析してます。
 これでStAXによるXMLファイルのデータ構造への落とし込みは技術的にOK。
 #XML定義ファイルのスキーマは設計中...。

#Tester.java
/** 
 * Created by IntelliJ IDEA. 
 * User: Yasumasa Ashida 
 * Date: 2005/12/03 
 * Time: 17:55:56 
 */ 
 
 import javax.xml.stream.XMLInputFactory; 
 import javax.xml.stream.XMLStreamException; 
 import javax.xml.stream.XMLEventReader; 
 import javax.xml.stream.events.XMLEvent; 
 import javax.xml.stream.events.StartElement; 
 import javax.xml.stream.events.Attribute; 
 import javax.xml.stream.events.EndElement; 
 import javax.xml.namespace.QName; 
 import java.io.BufferedInputStream; 
 import java.io.FileInputStream; 
 import java.io.FileNotFoundException; 
 
public class Tester { 
 
    private static final String fileName = "test.xml"; 
 
    private static final String ELEMENT = "element"; 
    private static final String ELEMENT_ID = "id"; 
    private static final String ATTR = "attribute"; 
    private static final String ATTR_NAME = "name"; 
    private static final String ATTR_VALUE = "value"; 
    private static final String COMPONENT = "component"; 
 
    public static void main(String[] args){ 
 
        // 入力ファクトリを取得する 
        XMLInputFactory xmlif = XMLInputFactory.newInstance(); 
 
        try{ 
            BufferedInputStream stream = new BufferedInputStream(new FileInputStream(fileName)); 
            XMLEventReader reader = xmlif.createXMLEventReader(stream); 
 
            while(reader.hasNext()){ 
                XMLEvent e = reader.nextEvent(); 
                analyzeElement(e,reader); 
                analyzeComponent(e,reader); 
            } 
            reader.close(); 
        }catch(XMLStreamException e){ 
            e.printStackTrace(); 
        }catch(FileNotFoundException e){ 
            e.printStackTrace(); 
        } 
    } 
 
    private static void analyzeElement(XMLEvent e,XMLEventReader reader) throws XMLStreamException{ 
        if(e.isStartElement()){ 
            StartElement se = (StartElement)e; 
            if(se.getName().getLocalPart().equals(ELEMENT)){ 
                Attribute attr = se.getAttributeByName(new QName(ELEMENT_ID)); 
                System.out.println(attr.getValue()); 
                analyzeAttributes(e,reader); 
            } 
        } 
    } 
 
    private static void analyzeComponent(XMLEvent e,XMLEventReader reader) throws XMLStreamException{ 
        if(e.isStartElement()){ 
             StartElement se = (StartElement)e; 
            if(se.getName().getLocalPart().equals(COMPONENT)){ 
                System.out.println(se.getName().getLocalPart()); 
                analyzeElements(e,reader); 
            } 
        } 
    } 
 
    private static void analyzeAttributes(XMLEvent e,XMLEventReader reader) throws XMLStreamException{ 
        boolean next_flg = false; 
        while(reader.hasNext() && !next_flg ){ 
            e = reader.nextEvent(); 
            if(e.isStartElement()){ 
                StartElement se = (StartElement)e; 
                if(se.getName().getLocalPart().equals(ATTR)){ 
                    Attribute attr = se.getAttributeByName(new QName(ATTR_NAME)); 
                    System.out.print(attr.getValue() + ":"); 
                    attr = se.getAttributeByName(new QName(ATTR_VALUE)); 
                    System.out.println(attr.getValue()); 
                }else{ 
                    next_flg = true; 
                } 
            }else if(e.isEndElement()){ 
                EndElement ee = (EndElement)e; 
                if(!ee.getName().getLocalPart().equals(ATTR)){ 
                    next_flg = true; 
                } 
            } 
        } 
    } 
 
    private static void analyzeElements(XMLEvent e,XMLEventReader reader) throws XMLStreamException{ 
        boolean next_flg = false; 
        while(reader.hasNext() && !next_flg ){ 
            e = reader.nextEvent(); 
            if(e.isStartElement()){ 
                analyzeElement(e,reader); 
            }else if(e.isEndElement()){ 
                EndElement ee = (EndElement)e; 
                if(!ee.getName().getLocalPart().equals(ELEMENT) && !ee.getName().getLocalPart().equals(ATTR)){ 
                    next_flg = true; 
                } 
            } 
        } 
    } 
} 
#test.xml
<?xml version="1.0" encoding="Windows-31J" ?>
<test>
  <element id="pepe" >
    <attribute name="test" value="pc"/>
    <attribute name="test" value="pc"/>
  </element>
  <elementid="popo" >
    <attribute name="test" value="pc"/>
  </element>
  <component>
    <elementid="pepe" >
      <attribute name="test"value="pc"/>
      <attribute name="test" value="pc"/>
    </element>
    <element id="popo" >
      <attribute name="test" value="pc"/>
    </element>
  </component>
</test>

_ [jboss]JBoss、WS-TS&CAF実装ArujunaTSを来春、オープンソース化(on off)

 メモメモφ。/* from ネバーバード日記(on off) and MYCOM(on off) */
 -->WEBサービストランザクション(on off)

_ [java.apserv]Geronimoアプリケーション・サーバーでのトランザクション(on off)

 メモメモφ。

_ [java.ajax]Using Ajax with Java Technology(on off)

 メモメモφ。/* from ネバーバード日記(on off) */

_ [java.design]クラシックJ2EEアーキテクチャーからの脱却(on off)

 メモメモφ。/* from オレンジニュース */

_ [ruby][svn]Collaboa(on off)

 Ruby製Tracもどき。開発中(現バージョンは0.5)。利用例はこちら(on off)
 /* from momonga-dev.ja ML:03255 */

_ [php]Sooey - brace 0.2.0(on off)

 メモメモφ。

_ [soft]Apache 2.2.0 + mod_proxy_balancer(on off)

 メモメモφ。

_ [soft]Apache 2.2.0 のロードバランス機能(mod_proxy_balancer)を使いこなす(on off)

 メモメモφ。/* from オレンジニュース */

_ [js.tech]Prototype.jsの入門記事「Quick Guide to Prototype」(on off)

 メモメモφ。/* from オレンジニュース */

_ [js.tech]Makeを利用したJavaScriptファイルの結合・圧縮(on off)

 メモメモφ。/* from オレンジニュース */

_ [study] naoyaのはてなダイアリー -直交する技術から複数のものを学ぶ(on off)

 メモメモφ。

_ [study]奈良先端大、講義ビデオのPodcast配信を開始(on off)

 メモメモφ。/* from オレンジニュース */

_ [web.design]セキュリティレベルの高いサイトを構築する 22 カ条(on off)

 メモメモφ。/* from オレンジニュース */

_ [web.design]XSS (Cross Site Scripting) Cheat sheet(on off)

 メモメモφ。/* from オレンジニュース */

_ [soft]Xen 3.0、リリース(on off)

 メモメモφ。/* to CNET(on off) and /.J(on off) */

_ [moz]「Firefox」のフォームで入力履歴の個別削除や自動補完の抑止を行うプラグイン(on off)

 メモメモφ。

_ [web.spot]RSSをまとめて表示してくれる新サービス「MixFeed」(on off)

 メモメモφ。/* from CNET(on off) AND Intermezzo(on off) */

_ [elec.pc]いくつもの難題を抱えて船出するViivテクノロジ(on off)

 メモメモφ。

_ [elec.home]ゲームシーンに合わせて部屋全体で臨場感! 新技術「amBX」が来年デビュー (on off)

 メモメモφ。

_ [elec.hard]メモリースティックはなくなるの?(on off)

 メモメモφ。

_ [science]量子バイトを実現――量子コンピューティングへの大きな一歩(on off)

 メモメモφ。

_ [elec.net]Bluetoothの設定手順は統一すべき(on off)

 メモメモφ。

_ [mail]マイクロソフトの新技術「SNARF」--人間関係を手がかりにメールを分類(on off)

 メモメモφ。

_ [java.fw]StrutsにXSSのセキュリティホール(Tomcat上では問題なし?)(on off)

 メモメモφ。/* from オレンジニュース */