java - 解析 xml 并在每个节点通知调用方法的类之后

标签 java 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();
        }
    }
}

最佳答案

您可以将“监听器”传递给 parseDocument 方法。监听器是一个接口(interface),它有一个可以在每个标签之后调用的方法。 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();
         }
    }
}

关于java - 解析 xml 并在每个节点通知调用方法的类之后,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42746921/

相关文章:

java - Spring Boot PostMapping 反序列化长数组

java - Eclipse Oxygen - 运行配置 : Classpath settings

java - 如何以编程方式填充 Android Manifest 元数据值?

java - 在 GridBagLayout 上组织 JPanel 时出现问题 (Java)

java - 如何在 Java EE 中注入(inject)外部定义的类

java - 从 Excel 坐标放置 anylogic 代理

c# - 代码隐藏中的绑定(bind)属性

python - 如何在Python中用虚线标记给定区域制作分割掩码

sql-server - 微软 SQL Server 2005/2008 : XML vs text/varchar data type

javascript - 播放 HTML5 视频时无法加载 XML 文件