使用sax解析器实现时的设计问题

时间:2013-11-06 22:15:01

标签: java design-patterns xml-parsing sax

我将通过以下单独的.java文件解释我的SAX解析器的设计实现。

Parser.java

public static void main(String[] args){
   Parser myParser = new Parser();
   Parser.parseXML(inputFile);  //may not be correct call, 
                             //but using it to make things clear to understand
}


public void parseXML(File inputFile) {
    SAXParserFactory factory = SAXParserFactory.newInstance();
    try {
        SAXParser   parser = factory.newSAXParser(); 
        SaxHandler handler = new SaxHandler();
        parser.parse(inputFile, handler);
    } ....
}

SaxHandler.java

public class SaxHandler extends DefaultHandler {

public void startElement(String uri, String localName, 
                         String qName, Attributes attributes) throws SAXException{
    MyClass mine = new MyClass();
    return mine.returnString;  // I would like to have this line so that I can return               
                              //"Hello" ultimately to the main method
}

public void characters(char ch[], int start, int length) throws SAXException { 
}  

public void endElement(String uri, String localName,
                       String qName) throws SAXException {
}

MyClass.java

public String returnString()
{
    return "Hello";
}

正如我在评论中提到的,我想找到一种方法或改变我的实现,以便我可以在main方法中获得字符串“Hello”。在上面的实现中,问题在于SAXHandler的startELement和endELement方法的返回类型。是否有任何变通方法或设计变更,以便我可以达到预期的效果? 我希望我的问题很明确。

由于

2 个答案:

答案 0 :(得分:1)

它背后的一般性问题似乎是:解析器如何根据读取内容构建一些数据结构。

在您的情况下,您可以将数据(即“Hello”)存储在SaxHandler的私有字段中。您还可以向SaxHandler添加一个getter,即String getData()。然后,方法parseXml可以用

结束
  return handler.getData();

答案 1 :(得分:0)

在SaxHandler的构造函数中,您可以获得对Parser对象的引用,并在Parser中调用所需的方法来处理您想要的字符串。

startElement的中间返回是不正确的,因为它会停止整个解析过程。因此,DefaultHandler中的所有方法都是void