1、需要软件
java,解析器(例如xerces),api(例如sax,dom)
2、sax机制
1)解析
string xmluri = "c:/test.xml";
string vendorparserclass = "org.apache.xerces.parsers.saxparser";
xmlreaer reader = xmlreaderfactory.createxmlreader(vendorparserclass);
inputsource inputsource = new inputsource(xmluri);
reader.parse(inputsource);
这样一个xml文档解析过程就完成了。因为sax是采用时间处理机制来解析xml
文档的,在解析过程中会触发一些事件,也就是执行特定的方法,你可以实现
这些方法,就可以通过解析xml来做一些事情了
2)处理
sax2.0定义的核心处理接口一共有
org.xml.sax.contenthandler
org.xml.sax.errorhandler
org.xml.sax.dtdhandler
org.xml.sax.entityresolver
这些接口是通过
org.xml.sax.xmlreader的setcontenthandler(),seteroorhandler(),
setdtdhandler(),setentityhandler()注册到解析器,这里面最重要的是
org.xml.sax.contenthandler接口,它具体如下
public interface contenthandler{
public void setdocumentlocator(locator locator);
public void startdocument() throws saxexception;
public void enddocument() throws saxexception;
public void startprefixmapping(string prefix,string uri)
throws saxexception;
public void endprefixmapping(string prifix)
throws saxexception;
public void startelement(string namespaceuri,string localname,
string qname,attributes atts) throws saxexception;
public void endelement(string namespaceuri,string localname,
string qname) throws saxexception;
public void characters(char ch[],int start,int length)
throws saxexception;
public void ignorablewhitespace(char ch[],int start,int length)
throws saxexception;
public void processinginstruction(string target,string data)
throws saxexception;
public void skippedentity(string name)
throws saxexception;
}
通过setcontenthandler()将你实现的contenthandler注册给xmlreader之后,
在解析过程中,系统根据各种条件执行接口中的方法,下面简单说明一下
1)文档定位器
private locator locator;
public void setdocumentlocator(locator locator){
this.locator = locator;
}
通常情况下,你只要如此实现就可以了,这个主要是得到当前解析的位置,
通过得到的locator,你可以使用它的getlinenumber(),getcolumnname()等
方法,可以得到文档当前的位置,但要注意的是,这个locator不能保存,只
针对当前的解析有效
2)文档的开头和结尾
public void startdocument() throws saxexception{
//解析过程中仅位于setdocumentlocator()方法后调用
}
public void enddocument() throws saxexception{
//解析过程中最后调用
}
大多数情况下你可以不用理他们,只要写个空方法就可以了
3)名字空间的开始和结束
public void startprefixmapping(string prefix,string uri)
throws saxexception{
}
public void endprefixmapping(string prifix)
throws saxexception{
}
4)元素的开始和结束
public void startelement(string namespaceuri,string localname,
string qname,attributes atts) throws saxexception{
}
public void endelement(string namespaceuri,string localname,
string qname) throws saxexception{
}
5)元素的数据
public void characters(char ch[],int start,int length)
throws saxexception{
string s = new string(ch,start,length);
}
这个是得到当前的元素的文本数据
6)可以忽略的空白
public void ignorablewhitespace(char ch[],int start,int length)
throws saxexception{
}
7)实体
public void skippedentity(string name)
throws saxexception{
}
8)指令处理
public void processinginstruction(string target,string data)
throws saxexception{
}
3)例子:这个是从java & xml 中复制过来的,
/*
* created on 2004-11-30
*
* todo to change the template for this generated file go to
* window - preferences - java - code style - code templates
*/
package javaxml2;
/**
* @author yuangfang
*
* todo to change the template for this generated type comment go to
* window - preferences - java - code style - code templates
*/
import java.io.*;
import java.util.*;
import org.xml.sax.*;
import org.xml.sax.ext.lexicalhandler;
import org.xml.sax.helpers.xmlreaderfactory;
import java.awt.*;
import javax.swing.*;
import javax.swing.tree.*;
public class saxtreeviewer extends jframe{
private string vendorparserclass = "org.apache.xerces.parsers.saxparser";
private jtree jtree;
defaulttreemodel defaulttreemodel;
public saxtreeviewer(){
super("sax tree viewer");
setsize(600,450);
}
public void init(string xmluri) throws ioexception,saxexception{
defaultmutabletreenode base = new defaultmutabletreenode("xml document:" + xmluri);
defaulttreemodel = new defaulttreemodel(base);
jtree = new jtree(defaulttreemodel);
buildtree(defaulttreemodel,base,xmluri);
getcontentpane().add(new jscrollpane(jtree),borderlayout.center);
}
public void buildtree(defaulttreemodel treemodel,defaultmutabletreenode base,string xmluri)
throws ioexception,saxexception{
string featureuri = "";
try{
xmlreader reader = xmlreaderfactory.createxmlreader(vendorparserclass);
contenthandler jtreecontenthandler = new jtreecontenthandler(treemodel,base);
errorhandler jtreeerrorhandler = new jtreeerrorhandler();
reader.setcontenthandler(jtreecontenthandler);
reader.seterrorhandler(jtreeerrorhandler);
reader.setentityresolver(new simpleentityresolver());
featureuri = "http://xml.org/sax/features/validation";
reader.setfeature(featureuri,true);
featureuri = "http://xml.org/sax/features/namespaces";
setnamespaceprocessing(reader,true);
featureuri = "http://xml.org/sax/features/string-interning";
reader.setfeature(featureuri,true);
featureuri = "http://apache.org/xml/features/validation/schema";
reader.setfeature(featureuri,false);
inputsource inputsource = new inputsource(xmluri);
reader.parse(inputsource);
}
catch(saxnotrecognizedexception e){
system.out.println("the parse class " + vendorparserclass
+ " does not recognize the feature uri " + featureuri);
system.exit(0);
}
catch(saxnotsupportedexception e){
system.out.println("the parser class " + vendorparserclass +
" does not support the feature uri " + featureuri);
}
}
private void setnamespaceprocessing(xmlreader reader,boolean state)
throws saxnotsupportedexception,saxnotrecognizedexception
{
reader.setfeature("http://xml.org/sax/features/namespaces",state);
reader.setfeature("http://xml.org/sax/features/namespace-prefixes",!state);
}
public static void main(string[] args) {
try{
if(args.length != 1){
system.out.println("usage:java javaxml2.saxtreeviewer " + "[xml document uri]");
system.exit(0);
}
saxtreeviewer viewer = new saxtreeviewer();
viewer.init(args[0]);
viewer.setvisible(true);
}catch(exception e)
{
e.printstacktrace();
}
}
}
class jtreecontenthandler implements contenthandler,lexicalhandler{
private defaulttreemodel treemodel;
private defaultmutabletreenode current;
private locator locator;
private map namespacemapp
闽公网安备 35060202000074号