我用sax解析xml文件,编译没错,就是不能输出endDocument方法里System.out.println()里的内容,大家帮忙看看是怎么回事啊? 程序如下:
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.util.*;
import java.io.*; 
public class SAXCounter extends DefaultHandler {
private Hashtable tags; //这个Hashtable用来记录tag出现的次数
// 处理文档前的工作\
public void startDocument() throws SAXException {
tags = new Hashtable();//初始化Hashtable
}
//对每一个开始元属进行处理\
public void startElement(String namespaceURI, String localName,
String rawName, Attributes atts)
throws SAXException
{
String key = localName;
Object value = tags.get(key);
if (value == null) {
// 如果是新碰到的标签,这在Hastable中添加一条记录
tags.put(key, new Integer(1));
} else {
// 如果以前碰到过,得到其计数值,并加1
int count = ((Integer)value).intValue();
count++;
tags.put(key, new Integer(count));
}
}
//解析完成后的统计工作\
public void endDocument() throws SAXException {
Enumeration e = tags.keys();
while (e.hasMoreElements()) {
String tag = (String)e.nextElement();
int count = ((Integer)tags.get(tag)).intValue();
System.out.println("Tag <" + tag + "> occurs " + count
+ " times");
}
}
//程序入口,用来完成解析工作\
static public void main(String[] args) {
String filename = null;
boolean validation = false;
filename="E:\\java\\SaxProcess\\page1.xml";
SAXParserFactory spf = SAXParserFactory.newInstance();
XMLReader xmlReader = null;
SAXParser saxParser=null;
try {
// 创建一个解析器SAXParser对象\
saxParser = spf.newSAXParser();
// 得到SAXParser中封装的SAX XMLReader
xmlReader = saxParser.getXMLReader();
    
} catch (Exception ex) {
System.err.println(ex);
System.exit(1);
}
try {
xmlReader.parse(filename);
} catch (SAXException se) {
System.err.println(se.getMessage());
System.exit(1);
} catch (IOException ioe) {
System.err.println(ioe);
System.exit(1);
}
}
}

解决方案 »

  1.   

    兄弟,SAXCounter你没有用到,怎么会打印啊!
    我相信你的startDocument也没有用到。
    使用下面的方法来解析吧
    xmlReader.parse(new InputSource(filename),new SAXCounter());
      

  2.   

    多谢了!我刚入门,好笨呢
    我是在JBuilder中调试的,
    xmlReader.parse(),中只能有一个String参数,就是xml文件的路径,不让带两个参数,否则出错为
    "SAXCounter.java": cannot find symbol; symbol  : method parse(org.xml.sax.InputSource,SAXCounter), location: interface org.xml.sax.XMLReader at line 68, column 11
    我把main()拿出来单独又写个类,还是不能用,不知道怎么回事
      

  3.   

    saxParser.parse(new File("src/links.xml"),handler);
      

  4.   

    saxParser.parse(new File("src/links.xml"),handler); 
    其中的handler 就是你的 SAXCounter 他继承了DefaultHandler src/links.xml 是要解析的xml
      

  5.   

    我用下面定义handler
     ContentHandler handler=new SAXCounter();
    用到saxParser.parse(new File("src/links.xml"),handler); 中,还是说找不到handler.
       反正saxParser.parse()只让带一个参数,好奇怪,在网上查一般也是只带个路径参数,没有带两个参数的,是sax包版本底吗?可不可以象jDom那样,下个新的装上啊
      

  6.   

    import java.io.*;
    import org.xml.sax.*;
    import org.xml.sax.helpers.DefaultHandler;
    import javax.xml.parsers.SAXParserFactory;
    import javax.xml.parsers.ParserConfigurationException;
    import javax.xml.parsers.SAXParser;public class Echo01 extends DefaultHandler{ StringBuffer textBuffer;

    static private Writer out;

    public static void main(String[] args){
    if(args.length!=1){
    //System.out.println("Usage: cmd filename");
    //System.exit(1);

    }

    DefaultHandler handler=new Echo01();
    SAXParserFactory factory=SAXParserFactory.newInstance();
    try{
    out=new OutputStreamWriter(System.out,"UTF8");
    SAXParser saxParser=factory.newSAXParser();
    saxParser.parse(new File("src/links.xml"),handler);
    }catch(Throwable t){
    t.printStackTrace();
    }
    System.exit(0);

    }

    public void   startDocument() throws SAXException {
    emit("<?xml version='1.0' encoding='UTF-8'?>");
    nl();
    }


    public void endDocument() throws SAXException {
    try{
    nl();
    out.flush();
    }catch(IOException e){
    throw new SAXException ("I/O error",e);
    }

    }

    public void startElement(String namespaceURI,String sName,String qName,Attributes attrs) throws SAXException {
    echoText();
    String eName=sName;
    if("".equals(eName)) eName=qName;
    emit("<"+eName);
    if(attrs!=null){
    for(int i=0;i<attrs.getLength();i++){
    String aName=attrs.getLocalName(i);
    if("".equals(aName)) aName=attrs.getQName(i);
    emit(" ");
    emit(aName+"=\""+attrs.getValue(i)+"\"");
    }
    }
    emit(">");
    }


    public void endElement(String namespaceURI,String sName,String qName) throws SAXException {

    echoText();
    String eName=sName;
    if("".equals(eName)) eName=qName;
    emit("</"+eName+">");
    }

    public void characters(char buf[],int offset,int len) throws SAXException {
    String s=new String(buf,offset,len);
    if(textBuffer==null){
    textBuffer=new StringBuffer(s);
    }else{
    textBuffer.append(s);
    }
    }

    public void echoText() throws SAXException{
    if(textBuffer==null) return;
    String s=""+textBuffer;
    emit(s);
    textBuffer=null;

    }

    private void emit(String s) throws SAXException {
    try{
    out.write(s);
    out.flush();
    }catch(IOException e){
    throw new SAXException ("I/O error",e);
    }

    } private void nl() throws SAXException {
    String lineEnd=System.getProperty("line.separator");
    try{
    out.write(lineEnd);
    }catch(IOException e){
    throw new SAXException ("I/O error",e);
    }

    }}
      

  7.   

    lxmiuamo () 兄可能是按照XXXX教育集团的教材上的例子吧。你把某些注释给隐掉了。
    书上的例子不一定对的。再说那本书印刷质量很差,很让人不放心。
    原文是:
    try{
       //使用指定的ConterHandler,解析给XML文件,这儿要注意的是,为了
       //程序的简单起见,这儿将主程序和ContentHandler放在了一起。实际上
       //main方法中所作的所有事情,都与ContentHandler无关。
       xmlReader.parse(new File(filename),new SAXCounter());
    }呵呵,晕死,多么费解的一句话。
    我查了网上的一些例子,都不用xmlReader.parse来解析的。
    比如下面一个例子。package simpleTest;
    import org.xml.sax.Attributes;
    import org.xml.sax.SAXException;
    import org.xml.sax.Locator;
    import org.xml.sax.ContentHandler;
    import org.xml.sax.InputSource;
    import org.xml.sax.helpers.DefaultHandler;
    import java.io.IOException;import javax.xml.parsers.SAXParser;
    import javax.xml.parsers.SAXParserFactory;class TestSAX extends DefaultHandler
    {
    private StringBuffer buf;public TestSAX()
    {
    super(); 
    }
    public void setDocumentLocator(Locator locator)
    {
    }
    public void startDocument() throws SAXException 
    {
    buf=new StringBuffer();
    System.out.println("*******开始解析文档*******");
    }
    public void endDocument() throws SAXException
    {
    System.out.println("*******文档解析结束*******");
    }public void startPrefixMapping( String prefix, String uri ) 
    {
    System.out.println(" 前缀映射: " + prefix +" 开始!"+ " 它的URI是:" + uri);
    }public void endPrefixMapping( String prefix )
    {
    System.out.println(" 前缀映射: "+prefix+" 结束!");
    }
    public void processingInstruction( String target, String instruction )
    throws SAXException
    {
    }
    public void ignorableWhitespace( char[] chars, int start, int length ) throws SAXException 
    {
    }public void skippedEntity( String name ) throws SAXException 
    {
    }public void startElement(String namespaceURI,String localName,String qName,Attributes atts) 
    {
    System.out.println("*******开始解析元素*******");
    System.out.println("元素名"+qName); 
    for(int i=0;i<atts.getLength();i++)
    {
    System.out.println("元素名"+atts.getLocalName(i)+"属性值"+atts.getValue(i));
    }
    }public void endElement(String namespaceURI,String localName,String fullName )throws SAXException
    {
    System.out.println("******元素解析结束********");
    }
    public void characters( char[] chars, int start, int length )throws SAXException
    {
    //将元素内容累加到StringBuffer中 
    buf.append(chars,start,length);
    }public static void main(String args[])
    {
    try{SAXParserFactory sf = SAXParserFactory.newInstance();
    SAXParser sp = sf.newSAXParser();
    TestSAX testsax=new TestSAX();
    sp.parse(new InputSource("D:\test\simpleTest\classes\simpleTest\test.xml"),testsax);}catch(IOException e)
    {
    e.printStackTrace(); 
    }catch(SAXException e)
    {
    e.printStackTrace(); 
    }catch(Exception e)
    {
    e.printStackTrace(); 
    }}
    }
    XML文件如下:
    <?xml version="1.0" encoding="gb2312"?>
    <row>
    <person>
    <name>王小明</name>
    <college>信息学院</college> 
    <telephone>6258113</telephone>
    <notes>男,1955年生,博士,95年调入海南大学</notes>
    </person>
    </row>  
     
      

  8.   

    我把main函数改了下,你看看行不?
    // 程序入口,用来完成解析工作\
    static public void main(String[] args) {
    String filename = null;
    boolean validation = false;
    filename = "src/links.xml";
    SAXParserFactory spf = SAXParserFactory.newInstance();
    XMLReader xmlReader = null;
    SAXParser saxParser = null;
    try {
    // 创建一个解析器SAXParser对象\
    saxParser = spf.newSAXParser();

    // 得到SAXParser中封装的SAX XMLReader
    saxParser.parse(new File(filename),new SAXCounter());//加了这一句
    xmlReader = saxParser.getXMLReader(); } catch (Exception ex) {
    System.err.println(ex);
    System.exit(1);
    }
    try {
    xmlReader.parse(filename);
    } catch (SAXException se) {
    System.err.println(se.getMessage());
    System.exit(1);
    } catch (IOException ioe) {
    System.err.println(ioe);
    System.exit(1);
    }
    }
      

  9.   

    我试过了,可以出结果,哈哈,
    saxParser.parse(new File(filename),new SAXCounter());//加了这一句
    这句加上结果出两次,因为有两个解析:
    saxParser.parse(...)
    xmlReader.parse(filename);
    去掉xmlReader.parse(filename);相关的语句,则解析一次
    可是如果去掉saxParser.parse(...)相关的语句,无结果显示
    奇怪,那还要xmlReader.parse(filename)干什么呢?