java sax程序不会进入startElement方法

问题描述

| 我正在尝试将sax解析器与自定义的DefaultHandler一起使用,但是奇怪的是,永远不会调用dHandler中的startElement()方法。 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,1);
                    mod.setValueAt(states.get(i).population_2k10,2);
                    mod.setValueAt(states.get(i).rank_2k,3);
                    mod.setValueAt(states.get(i).census_1990,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 {

        }

     } 
    

解决方法

        请检查import语句中的Attribute参数,它应该是:
import org.xml.sax.Attributes;
问候     ,        也许您没有正确覆盖默认值
startElement()
。如果在方法中添加“ 4”注释,则不会出现编译时错误。如果这样做,则
startElement(...)
(您未显示)的声明不正确。 编辑:您的
startElement
声明需要看起来像这样:
void startElement(
    String uri,String localName,String qName,Attributes attributes) 
参数名称可以不同,但​​是参数的数量及其类型必须完全匹配。     ,        我认为您的意思是该元素的名称为\'state \'。如果是这样,DefaultHandler.startElement实现中的以下行应为:
if (name.equals(\"state\")){
    total++;
}
代替
if (element.equals(\"state\")){
    total++;
}
startElement方法的第三个参数实际上是qName。如果不存在名称空间前缀,则为空;否则为0。如果存在前缀,则将填充它。 编辑 看来原始代码不会编译,至少不会针对我使用的Oracle / Sun Java 6编译器进行编译。如果要计算总元素数,则这是DefaultHandler类的实现的样子:
DefaultHandler handler = new DefaultHandler() {

    public int total = 0;

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

    public void endDocument() {
        System.out.println(\"Total elements: \" + total);
    }
};
请注意,total变量现在是匿名类的成员。如果不是,则必须在外部类中将其声明为final,这将使其不可变(将增量操作视为非法)。但是,不能从匿名类外部访问总变量。我建议在另一个类中扩展DefaultHandler类,并使用该处理程序实现,以使事情保持简单。     

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...