java sax程序不会去startElement()方法

时间:2011-06-10 03:27:19

标签: java xml sax

我正在尝试使用带有自定义DefaultHandler的sax解析器,但是从不调用dHandler中的startElement()方法这一奇怪的事情。 endDocument()可以正常工作,但它会打印

Total elements:0

虽然我的xml文件有11个“state”类型的元素。

如果我将总++放在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 个答案:

答案 0 :(得分:16)

请检查属性参数的import语句,它应该是:

import org.xml.sax.Attributes;

此致

答案 1 :(得分:1)

也许您没有正确覆盖默认startElement()。如果向方法添加@Override注释,则不应该出现编译时错误。如果您这样做,那么startElement(...)(您没有显示)的声明是不正确的。

编辑:您的startElement声明需要如下所示:

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

参数名称可以不同,但​​参数的数量及其类型必须完全匹配。

答案 2 :(得分:0)

我认为你的意思是元素的名称是'state'。如果是这样,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,这将使其不可变(将增量操作呈现为非法)。但是,不能从匿名类外部访问总变量。我建议在另一个类中扩展DefaultHandler类,并使用该处理程序实现来保持简单。