TA的每日心情 | 开心 2021-3-12 23:18 |
---|
签到天数: 2 天 [LV.1]初来乍到
|
下面是用SAX分析XML文件的样板程序,来自《XML与java程序设计大全》(陈锦辉 王景皓著)
import java.io.IOException;
import java.io.FileInputStream;
import java.util.Properties;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.ErrorHandler;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
/**
* <code>MySAXParser</code>可以从命令行下读入一个XML文件并且
*使用SAX标准的机制来分析该文件。
*
*/
public class MySAXParser{
public void parseXML(String uri) {
try{
System.out.println("正在分析中的XML文件: " + uri + "
");
XMLReader parser =XMLReaderFactory.createXMLReader(
"org.apache.xerces.parsers.SAXParser");
//XMLReader parser = new SAXParser();
//注册我们所设计的内容处理器
parser.setContentHandler(new MyContentHandler());
//注册我们的错误处理器
parser.setErrorHandler(new MyErrorHandler());
//分析文件
parser.parse(uri);
} catch(IOException ioe){
System.out.println("文件读取错误:"+ioe.getMessage());
} catch(SAXException saxe){
System.out.println("XML分析错误: "+saxe.getMessage());
}
}
public static void main(String[] args) {
//如果参数数目不对,则输出使用说明,并结束程序
if( args.length != 1 ){
System.out.println("请输入欲分析的文件名: " +"java MySAXParser [XML URI]");
System.exit(-1);
}
String uri = args[0];
MySAXParser myParser = new MySAXParser();
myParser.parseXML(uri);
}
}
class MyContentHandler implements ContentHandler {
/**保留Locator对象的信息*/
private Locator locator;
public void setDocumentLocator (Locator locator){
System.out.println("设置Locator对象..");
//把SAX的Locator对象放到到我们自己的Locator对象里
this.locator = locator;
}
public void startDocument() throws SAXException{
System.out.println("文件分析开始->");
}
public void endDocument()throws SAXException{
System.out.println("<-文件分析结束");
}
public void startPrefixMapping (String prefix, String uri)
throws SAXException{
System.out.println( "命名空间对应开始->" +
"第" + locator.getLineNumber() + "行" +
"
命名空间前导符: " + prefix +
"
相对应的统一资源标识符: " + uri);
}
public void endPrefixMapping (String prefix)
throws SAXException{
System.out.println("<-命名空间对应结束" );
}
public void startElement (String namespaceURI, String localName,
String qName, Attributes atts)throws SAXException{
System.out.print("元素开始: " + localName);
if(namespaceURI.equals("")) {
namespaceURI = "没有命名空间";
}
System.out.println(", 命名空间: " + namespaceURI +", 限定名: " + 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 qName)
throws SAXException{
System.out.print("元素结束: " + localName);
if(namespaceURI.equals("")) {
namespaceURI = "没有命名空间";
}
System.out.println(", 命名空间: " + namespaceURI +", 限定名: " + qName + ".");
}
public void characters (char ch[], int start, int length)throws SAXException{
String charData = new String(ch, start, length);
System.out.println("字符数据: "" + charData + """);
}
public void ignorableWhitespace (char ch[], int start, int length)throws SAXException{ String whiteSpace = new String(ch, start, length);
System.out.println("空格符: "" + whiteSpace + """);
}
public void processingInstruction (String target, String data)throws SAXException{
System.out.println("处理命令 目标(target):" + target+ " 和其数据(data):" + data);
}
public void skippedEntity (String name)throws SAXException{
System.out.println("忽略的实体: " + name);
}
}// :) MyContentHandler
class MyErrorHandler implements ErrorHandler {
public void warning (SAXParseException e)throws SAXException {
System.out.println(
"----分析警告----
" +
" 发生位置: 第" + e.getLineNumber() + "行, " +
" 第" + e.getColumnNumber() + "字
" +
" 系统标识符: " + e.getSystemId() + "
" +
" 公用标识符: " + e.getPublicId() + "
" +
" 错误消息: " + e.getMessage()
);
throw new SAXException("遇到警告.", e);
}
public void error (SAXParseException e)throws SAXException{
System.out.println(
"----可恢复的分析错误----
" +
" 发生位置: 第" + e.getLineNumber() + "行, " +
" 第" + e.getColumnNumber() + "字
" +
" 系统标识符: " + e.getSystemId() + "
" +
" 公用标识符: " + e.getPublicId() + "
" +
" 错误消息: " + e.getMessage()
);
throw new SAXException("遇到可恢复错误.", e);
}
/**
*接受不可恢复的错误调用
*
*/
public void fatalError(SAXParseException e) throws SAXException{
System.out.println(
"----不可恢复的分析错误----
" +
" 发生位置: 第" + e.getLineNumber() + "行, " +
"第" + e.getColumnNumber() + "字
" +
" 系统标识符: " + e.getSystemId() + "
" +
" 公用标识符: " + e.getPublicId() + "
" +
" 错误消息: " + e.getMessage()
);
throw new SAXException("遇到不可恢复错误.", e);
}
}// :) end of MyErrorHandler
下面是运行程序的结果:
C:java>set CLASSPATH=c:javajarxerces.jar;c:jdk1.4lib;c:j2ee1.3.1libj2ee
.jar;c:j2ee1.3.1liblocale;c:java
C:java>java MySAXParser booklist.xml
正在分析中的XML文件: booklist.xml(下略)
源码下载:http://file.javaxxz.com/2014/10/10/040614937.zip |
|