Java-программа саксофон не идет в метод startElement () - PullRequest
3 голосов
/ 10 июня 2011

Я пытаюсь использовать синтаксический анализатор с настраиваемым DefaultHandler, но странная вещь, что метод startElement () в dHandler никогда не вызывается. endDocument () работает как надо, но печатает

Total elements:0

, в то время как мой xml-файл содержит 11 элементов типа «состояние».

если даже я помещу total ++ вне оператора if, так что он будет увеличиваться при каждом вызове startElement (), он по-прежнему будет содержать 0 элементов.

пожалуйста, помогите мне в этом, спасибо

if(e.getSource()==open)
    {
        JFileChooser chooseFile=new JFileChooser();
        int returnVal = chooseFile.showOpenDialog(wnd);
         if (returnVal == JFileChooser.APPROVE_OPTION) {
            File file = chooseFile.getSelectedFile();

                //This is where a real application would open the file.
                parser.parse(new InputSource(new FileInputStream(file)));
                DocumentImpl document = (DocumentImpl)parser.getDocument();
                Node root = document.getLastChild();
                AllElements allelements = new AllElements();
                NodeIteratorImpl iterator =(NodeIteratorImpl)document.createNodeIterator(root,
        NodeFilter.SHOW_ELEMENT, (NodeFilter)allelements, true);
                Node n;
                states.removeAll(states);
                while ((n = iterator.nextNode()) != null)
                {

                    if(n.getNodeName().equals("state"))
                    {
                        NamedNodeMap attrs = n.getAttributes();
                        NodeList children=n.getChildNodes();
                        State newState=new State(attrs.item(0).getNodeValue(),
                                attrs.item(1).getNodeValue(),attrs.item(2).getNodeValue(),attrs.item(3).getNodeValue(),children.item(0).getTextContent());
                        states.add(newState);

                    }

                }
                Collections.sort(states,new StateComparator());
                mod.setRowCount(states.size());
                mod.setColumnCount(5);
                for(int i=0;i<states.size();i++)
                {
                    mod.setValueAt(states.get(i).abbr, i, 0);

                    mod.setValueAt(states.get(i).name, i, 1);
                    mod.setValueAt(states.get(i).population_2k10, i, 2);
                    mod.setValueAt(states.get(i).rank_2k, i, 3);
                    mod.setValueAt(states.get(i).census_1990, i, 4);
                }

                mean=0;
                max=MAXIMUM;
                min=MINIMUM;
                count=0;
                  total=0;
                  SAXParserFactory parserFact = SAXParserFactory.newInstance();
        SAXParser parserS = parserFact.newSAXParser();
        DefaultHandler dHandler = new DefaultHandler(){
            public void startElement(String uri, String name, String element, Attributes atri)
                            {
                if (element.equals("state")){
                    total++;
                }
            }
            public void endDocument(){
                System.out.println("Total elements: " + total);
            }
        };
                  parserS.parse(file, dHandler);
                  meanL.setText("mean="+mean);
                  maxL.setText("max="+max);
                  minL.setText("min="+min);
                  countL.setText("count="+total);
        } else {

        }

     } 

Ответы [ 3 ]

16 голосов
/ 15 августа 2011

Пожалуйста, проверьте оператор импорта для параметра Attribute, он должен быть:

import org.xml.sax.Attributes;

Привет

1 голос
/ 10 июня 2011

Возможно, вы не изменили значение по умолчанию startElement() правильно. Если вы добавите аннотацию @Override в метод, вы не должны получить ошибку во время компиляции. Если вы это сделаете, то объявление startElement(...) (которое вы не показывали) неверно.

РЕДАКТИРОВАТЬ: Ваша startElement декларация должна выглядеть следующим образом:

void startElement(
    String uri, 
    String localName, 
    String qName, 
    Attributes attributes) 

Имена параметров могут быть разными, но количество аргументов и их типы должны точно совпадать.

0 голосов
/ 10 июня 2011

Я думаю, вы имели в виду, что имя элемента - «состояние». Если это так, следующая строка в реализации DefaultHandler.startElement должна быть:

if (name.equals("state")){
    total++;
}

вместо

if (element.equals("state")){
    total++;
}

Третьим параметром метода startElement на самом деле является qName. Он будет пустым, если префикс пространства имен не существует; если префикс присутствует, он будет заполнен.

Редактировать

Не похоже, что исходный код будет компилироваться, по крайней мере, не с использованием компилятора Oracle / Sun Java 6, который я использовал. Вот как должна выглядеть реализация класса DefaultHandler, если подсчитать общее количество элементов:

DefaultHandler handler = new DefaultHandler() {

    public int total = 0;

    public void startElement(String uri, String name, String qName,
            Attributes atri) {
        if (qName.equals("state")) {
            total++;
        }
    }

    public void endDocument() {
        System.out.println("Total elements: " + total);
    }
};

Обратите внимание, что переменная total теперь является членом анонимного класса. Если это не так, то он должен быть объявлен как final во внешнем классе, что сделает его неизменным (что делает операцию приращения недопустимой). Однако нельзя получить доступ к переменной total вне анонимного класса. Я бы предложил расширить класс DefaultHandler в другом классе и использовать реализацию этого обработчика, чтобы все было просто.

...