2017-03-12 4 views
1

私は、解析された各コード行について、xmlパーサのインスタンスとインスタンスを作成するクラスに通知する最善の方法を探しています。xmlを解析し、各ノードがメソッドを呼び出すクラスを通知した後

私は、次の行を読み込む前にパーサから取得した各行の後にguiなどを更新したいと思います。これを達成するにはどうすればよいでしょうか? xmlparserをオブザーバーにする?

Controller.java

public class Controller { 
     public Controller(){ 
      XMLParser parser = new XMLParser(): 
      parser.parseDocument() //Get value after each loop 
     } 
} 

XMLParser.java

public class XMLParser { 

    String type="", value=""; 

    public void parseDocument() throws Exception{ 
     XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
     InputStream in = new FileInputStream("gaugeInput.xml"); 
     XMLStreamReader streamReader = inputFactory.createXMLStreamReader(in); 
     streamReader.nextTag(); // Advance to "gauge_input" element 
     streamReader.nextTag(); // Advance to "gauge" element 

     while (streamReader.hasNext()) { 
      if (streamReader.isStartElement()) { 
       switch (streamReader.getLocalName()) { 
        case "type": { 
         type = streamReader.getElementText(); 
         break; 
        } 
        case "value": { 
         value = streamReader.getElementText(); 
         break; 
        } 
       } 
      } 
      else if(streamReader.isEndElement()){ 
       System.out.println("Package for controller: type: "+type+" value: "+value); 
      } 
      streamReader.next(); 
     } 
    } 
} 

答えて

1

あなたはparseDocument方法に "リスナー" を渡すことができます。リスナーは、各タグの後に呼び出すことができるメソッドを持つインターフェースになります。 Controllerクラスは通知を受け取るためにリスナーを実装できます。

これは、このようなものに見えるコードで動作します:

public interface TagListener { 
    void onTagRead(<parameters>); 
} 

public class Controller implements TagListener { 
    public Controller(){ 
     XMLParser parser = new XMLParser(): 
     parser.parseDocument(this) // pass the controller instance to get notified 
    } 

    public void onTagRead(<parameter>) { 
     // your logic :) 
    } 
} 

public class XMLParser { 

    String type="", value=""; 

    public void parseDocument(TagListener listener) throws Exception{ 
      XMLInputFactory inputFactory = XMLInputFactory.newInstance(); 
      InputStream in = new FileInputStream("gaugeInput.xml"); 
      XMLStreamReader streamReader = inputFactory.createXMLStreamReader(in); 
      streamReader.nextTag(); // Advance to "gauge_input" element 
      streamReader.nextTag(); // Advance to "gauge" element 

      while (streamReader.hasNext()) { 
       if (streamReader.isStartElement()) { 
        switch (streamReader.getLocalName()) { 
         case "type": { 
          type = streamReader.getElementText(); 
          break; 
         } 
         case "value": { 
          value = streamReader.getElementText(); 
          break; 
         } 
        } 
       } 
       else if(streamReader.isEndElement()){ 
        listener.onTagRead(...); 
       } 
       streamReader.next(); 
     } 
    } 
} 
関連する問題