我想使用薩克斯解析器與自定義的DefaultHandler,但奇怪的事情,在dHandler startElement()方法永遠不會被調用。調用endDocument()的作品,因爲它應該,但它打印java薩克斯程序不去startElement()方法
Total elements:0
,而我的XML文件的類型是「國家」的11個元素。
如果即使我把總++放在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 {
}
}
順便說一句,你不應該使用SAX的實現類,像DocumentImpl。使用界面文檔。 – MeBigFatGuy 2011-06-10 03:47:31
你的代碼是如何在第一個地方編譯的?你的'DefaultHandler'實現是一個匿名的本地類;其中引用的'total'變量必須是'final'。 – 2011-06-10 04:06:33