2017-03-12 14 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(); 
     } 
    } 
}