Pergunta

Explicarei minha implementação de design do analisador sax através dos seguintes arquivos .java separados.

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";
}

Como mencionei nos comentários, quero descobrir uma maneira ou alterar minha implementação para que eu possa obter a string "Hello" no método principal. Na implementação acima, o problema é com os tipos de retorno de métodos de startElement e endElement do saxhandler. Há alguma solução alternativa ou alterações de design para que eu possa alcançar o resultado desejado? Espero que minha pergunta esteja clara.

Obrigado

Foi útil?

Solução

A questão mais geral por trás disso parece ser: como o analisador pode criar alguma estrutura de dados a partir do que está lendo.

No seu caso, você pode armazenar os dados (ou seja, "Olá") em um campo privado do saxhandler. Além disso, você adiciona um getter, ou seja String getData() para saxhandler. O método parsexml poderia então terminar com

  return handler.getData();

Outras dicas

No construtor do seu saxhandler, você pode obter uma referência ao objeto Parser e chamar métodos desejados no analisador que lidariam com a string que você deseja.

Retornando no meio de startElement não está correto porque interromperia todo o processo de análise. Portanto, todos os métodos em DefaultHandler são void.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top