我用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);
}
}
}
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);
}
}
}
解决方案 »
- Comparator接口的compare方法怎么实现排序的????
- java 菜鸟问题
- 运行JAVA命令出现错误
- 通过GPRS网络建立连接,为什么只能连接一次,是不是我的代码哪里有问题?
- 在线求助高手?点菜单里的某一按钮,相应事件出JProgress,代码看内容
- IO基本问题----我想应该没几个人会!
- 大家谁能给我一个画图的程序让我研究下,谢谢 !
- UltraEdit用于调试java,Ctrl+Shift+0快捷键被输入法占用了,如何改变javac等命令的快捷键?
- 调查兼散分:关于你开发过什么管理软件,什么架构(C/S或B/S);UP有分!
- 哪有jdk的api doc
- 多线程问题,为什么其中一个线程运行到一半会被其他线程中断掉呢?40分,给答案就立马给分,在线等中
- JFileChooser文本框问题
我相信你的startDocument也没有用到。
使用下面的方法来解析吧
xmlReader.parse(new InputSource(filename),new SAXCounter());
我是在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()拿出来单独又写个类,还是不能用,不知道怎么回事
其中的handler 就是你的 SAXCounter 他继承了DefaultHandler src/links.xml 是要解析的xml
ContentHandler handler=new SAXCounter();
用到saxParser.parse(new File("src/links.xml"),handler); 中,还是说找不到handler.
反正saxParser.parse()只让带一个参数,好奇怪,在网上查一般也是只带个路径参数,没有带两个参数的,是sax包版本底吗?可不可以象jDom那样,下个新的装上啊
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);
}
}}
书上的例子不一定对的。再说那本书印刷质量很差,很让人不放心。
原文是:
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>
// 程序入口,用来完成解析工作\
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);
}
}
saxParser.parse(new File(filename),new SAXCounter());//加了这一句
这句加上结果出两次,因为有两个解析:
saxParser.parse(...)
xmlReader.parse(filename);
去掉xmlReader.parse(filename);相关的语句,则解析一次
可是如果去掉saxParser.parse(...)相关的语句,无结果显示
奇怪,那还要xmlReader.parse(filename)干什么呢?