有关采用java的sax解析xml的问题(100分)

  • 主题发起人 主题发起人 cadwolf
  • 开始时间 开始时间
C

cadwolf

Unregistered / Unconfirmed
GUEST, unregistred user!
我适应sax解析xml文档,首先建立一个Parser对象,用ParserFactory.makeParser()获得,
可老出现下面的异常,请问是怎么回事啊?
java.lang.NullPointerException: No value for sax.parser property
at org.xml.sax.helpers.ParserFactory.makeParser(ParserFactory.java:90)
at TemplateHandler.main(TemplateHandler.java:32)
源代码如下:
import org.xml.sax.*;
import org.xml.sax.helpers.ParserFactory;
import java.io.*;
import java.util.*;
public class TemplateHandler extends HandlerBase
{
private Writer out;
public TemplateHandler(Writer w)
{out = w;}
public void startElement(String name,AttributeList attrs)
throws SAXException
{
try
{
int attLen;
out.write("<"+name);
out.write(">");
}
catch(IOException e)
{
e.printStackTrace();
}

}
public static void main(String args[])
{
try
{
Parser p = ParserFactory.makeParser();
Writer out = new OutputStreamWriter(System.out);
p.setDocumentHandler(new TemplateHandler(out));
p.parse(new InputSource(args[0]));
out.close();
}
catch(Exception e)
{
e.printStackTrace(System.err);
}
}
}
另请问ParserFactory.makeParser(String className)怎么用,className指的是什么?
 
Parser p = ParserFactory.makeParser(
"org.apache.xerces.parsers.SAXParser");
 
这样好像不行吧
我用
Parser p = ParserFactory.makeParser(
"org.xml.sax.SAXParser");
试了,但又出现如下异常
java.lang.InstantiationException: org.xml.sax.Parser
at java.lang.Class.newInstance0(Class.java:281)
at java.lang.Class.newInstance(Class.java:249)
at org.xml.sax.helpers.NewInstance.newInstance(NewInstance.java:44)
at org.xml.sax.helpers.ParserFactory.makeParser(ParserFactory.java:127)
at TemplateHandler.main(TemplateHandler.java:32)
这是怎么回事呢?
我如果只想用Parser.makeParser()怎么用呢?

 
xml parser是一种插件结构。在你的classpath中需要包含一个properties文件,其中指明默认使用
的parser.
具体的各个不同的sax实现各有不同,比如在xerces的包里你可以找到如下的
内容:
xervesImpl.jar/META-INF/services/javax.xml.parsers.SAXParserFactory
这个文件中指明了具体实现这个接口的类名:
org.apache.xerces.jaxp.SAXParserFactoryImpl
请检查你的classpath中是否包含了xerces的运行包,或者其他任何saxParser的运行包,
必须能找到这个配置文件。
 
HandlerBase Deprecated. This class works with the deprecateddo
cumentHandler interface.
It has been replaced by the SAX2 DefaultHandler class.
下面是一段由jb7生成的代码,可以参考一下:
package xmlsax1;
import java.io.IOException;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.apache.xerces.parsers.SAXParser;
public class SaxParser1 extends DefaultHandler {
public static void main(String[] argv) {
if (argv.length != 1) {
System.out.println("Usage: java SaxParser1 [URI]");
System.exit(0);
}
String uri = argv[0];
try {
XMLReader parser = XMLReaderFactory.createXMLReader("org.apache.xerces.parsers.SAXParser");
SaxParser1 SaxParser1Instance = new SaxParser1();
parser.setContentHandler(SaxParser1Instance);
parser.parse(uri);
}
catch(IOException ioe) {
ioe.printStackTrace();
}
catch(SAXException saxe) {
saxe.printStackTrace();
}
}
}
 
to:曹晓钢
java编译器默认要找的classpath F:/jdk1.4/jre/lib/rt.jar
(假设path=f:/jdk1.4/bin)中有org.xml.sax.parser类啊,问题是为什么会出现如上所
述的异常呢。照你的说法是classpath的问题,应该是ClassNotFounded异常啊,请问怎么
回事?
 
那个parser类只是个接口。必须要有实现。
 
请问需要如何实现啊?
我想用org.xml.sax.Parser类怎么办呢?能说的具体点吗?
如你说的内容:
xervesImpl.jar/META-INF/services/javax.xml.parsers.SAXParserFactory
这个文件中指明了具体实现这个接口的类名:
org.apache.xerces.jaxp.SAXParserFactoryImpl
我怎么加到我的系统中呢?
 
多人接受答案了。
 
后退
顶部