/*
SAX轻松入门(三)--SAX过滤器(filter)
author:shine
*/
在jsp中有filter,同样在SAX中也有。
先介绍org.xml.sax.helper.XMLFIlterImple,它实现了XMLFilter, ContentHandler, ErrorHandler, EntityResolver, 和DTDHandler接口,所以只要继承该类,并覆盖相应的方法(你想要过滤的“事件”)就能达到过滤效果。
少说理论,看看例子吧:
(下面的例子主要是通过Filter进行命名空间的改变)
1、.先准备一个xml文件(不验证)
<?xml version="1.0" encoding="UTF-8"?>
<my:poem xmlns:my="http://www.shine.com"
xmlns:your="http://www.yaoyao.com">
<my:title titleId="1">Roses are Red</my:title>
<my:i>Roses are red,</my:i>
<my:i>Violets are blue;</my:i>
<my:i>Sugar is sweet,</my:i>
<my:i>And I love you</my:i>
<your:i>wow!my god!</your:i>
</my:poem>
2、再准备个SAX解析类:
package test;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.Locator;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;
public class Test1 implements ContentHandler{
private Map nameSpaceMappings = new HashMap(); //参考startPrefixMapping,endPrefixMapping
private Locator locator = null; //参考setDocumentLocator
public void startDocument() throws SAXException {
// 文档开始时触发
System.out.println("startDocument:");
}
public void endDocument() throws SAXException {
// 文档结束时触发
System.out.println("endDocument:");
}
public void startPrefixMapping(String prefix, String uri) throws SAXException {
// 命名空间开始时触发
System.out.println("startPrefixMapping:");
System.out.println("prefix = "+prefix);
System.out.println("uri = "+uri);
nameSpaceMappings.put(uri, prefix); //当进入某个命名空间时,使用mapping记住prefix
}
public void endPrefixMapping(String prefix) throws SAXException {
System.out.println("endPrefixMapping:");
System.out.println("prefix = "+prefix);
// 命名空间结束时触发
Iterator iterator = nameSpaceMappings.keySet().iterator();
while(iterator.hasNext()){
String uri = (String)iterator.next();
String thisPrefix = (String)nameSpaceMappings.get(uri);
if(prefix.equals(thisPrefix)){
nameSpaceMappings.remove(uri); //当退出某个命名空间,从mapping中删除该命名空间
break;
}
}
}
public void processingInstruction(String target, String data) throws SAXException {
// 处理指令时触发(注:<?xml version="1.0"?不算>)
System.out.println("processingInstruction:");
System.out.println();
}
public void setDocumentLocator(Locator locator) {
System.out.println("setDocuemntLocator:");
// 用来知道执行到哪一行,哪一列(通过getLineNumber()和getColumnNumber())
this.locator = locator;
}
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
// 元素开始时触发
System.out.println("startElement:");
System.out.println("uri = "+uri);
System.out.println("localName = "+localName);
System.out.println("qName = "+qName);
//浏览属性
System.out.println("Attributes:");
for(int i=0; i < attrs.getLength(); i++) {
System.out.println("attributeLocalName = "+attrs.getLocalName(i));
System.out.println("attributeQName = "+attrs.getQName(i));
System.out.println("attributeURI = "+attrs.getURI(i));
System.out.println("attributeType = "+attrs.getType(i));
System.out.println("attributeValue = "+attrs.getValue(i));
}
//使用locator对象定位
System.out.println("LocatorLine = "+this.locator.getLineNumber());
//使用nameSpaceMappings查看该元素的命名空间
System.out.println("nameSpaceMappings = "+nameSpaceMappings.get(uri));
}
public void endElement(String uri, String localName, String qName) throws SAXException {
// 元素结束时触发
System.out.println("endElement:");
System.out.println("uri = "+uri); //uri:该元素的命名空间
System.out.println("localNmae = "+localName); //localName:不带命名空间的元素名字
System.out.println("qName = "+qName); //qName:带命名空间的元素名字
}
public void characters(char[] ch, int start, int length) throws SAXException {
// 遇到文本时触发
String str = new String(ch,start,length);
System.out.println("character:"+str);
}
public void ignorableWhitespace(char[] arg0, int arg1, int arg2) throws SAXException {
// 用的很少(略)
}
public void skippedEntity(String arg0) throws SAXException {
// 一般不可能跳过实体,所以此方法略
}
}
2、最后是Filter类。
package test;
import java.io.IOException;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLFilterImpl;
import org.xml.sax.helpers.XMLReaderFactory;
public class Test1Filter extends XMLFilterImpl{
private String newURI = null;
private String oldURI = null;
public Test1Filter(XMLReader reader,String newURI,String oldURI) {
super(reader);
this.newURI = newURI;
this.oldURI = oldURI;
}
public void endElement(String uri, String localName, String qName) throws SAXException {
// TODO Auto-generated method stub
if(uri.equals(this.oldURI)) {
uri = newURI;
}
super.endElement(uri, localName, qName);
}
public void startElement(String uri, String localName, String qName, Attributes attrs) throws SAXException {
// TODO Auto-generated method stub
if(uri.equals(this.oldURI)) {
uri = newURI;
}
super.startElement(uri, localName, qName,attrs);
}
public void startPrefixMapping(String prefix, String uri) throws SAXException {
// TODO Auto-generated method stub
if(uri.equals(this.oldURI)) {
uri = newURI;
}
super.startPrefixMapping(prefix, uri);
}
public static void main(String[] args) {
try {
XMLReader reader = XMLReaderFactory.createXMLReader();
String xmlURI = "D://workplace//test1.xml";
String oldURI = "http://www.shine.com";
String newURI = "http://www.yaoyao.com";
Test1Filter filter = new Test1Filter(reader,newURI,oldURI);
Test1 test1 = new Test1();
filter.setContentHandler(test1);//过滤完后文件交给Test1类解析
InputSource inputSource = new InputSource(xmlURI);
filter.parse(inputSource);
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果是:
setDocuemntLocator:
startDocument:
startPrefixMapping:
prefix = my
uri = http://www.yaoyao.com
startPrefixMapping:
prefix = your
uri = http://www.yaoyao.com
startElement:
uri = http://www.yaoyao.com
localName = poem
qName = my:poem
Attributes:
LocatorLine = 4
nameSpaceMappings = your
character:
startElement:
uri = http://www.yaoyao.com
localName = title
qName = my:title
Attributes:
attributeLocalName = titleId
attributeQName = titleId
attributeURI =
attributeType = CDATA
attributeValue = 1
LocatorLine = 5
nameSpaceMappings = your
character:Roses are Red
endElement:
uri = http://www.yaoyao.com
localNmae = title
qName = my:title
character:
startElement:
uri = http://www.yaoyao.com
localName = i
qName = my:i
Attributes:
LocatorLine = 6
nameSpaceMappings = your
character:Roses are red,
endElement:
uri = http://www.yaoyao.com
localNmae = i
qName = my:i
character:
startElement:
uri = http://www.yaoyao.com
localName = i
qName = my:i
Attributes:
LocatorLine = 7
nameSpaceMappings = your
character:Violets are blue;
endElement:
uri = http://www.yaoyao.com
localNmae = i
qName = my:i
character:
startElement:
uri = http://www.yaoyao.com
localName = i
qName = my:i
Attributes:
LocatorLine = 8
nameSpaceMappings = your
character:Sugar is sweet,
endElement:
uri = http://www.yaoyao.com
localNmae = i
qName = my:i
character:
startElement:
uri = http://www.yaoyao.com
localName = i
qName = my:i
Attributes:
LocatorLine = 9
nameSpaceMappings = your
character:And I love you
endElement:
uri = http://www.yaoyao.com
localNmae = i
qName = my:i
character:
startElement:
uri = http://www.yaoyao.com
localName = i
qName = your:i
Attributes:
LocatorLine = 10
nameSpaceMappings = your
character:wow!my god!
endElement:
uri = http://www.yaoyao.com
localNmae = i
qName = your:i
character:
endElement:
uri = http://www.yaoyao.com
localNmae = poem
qName = my:poem
endPrefixMapping:
prefix = your
endPrefixMapping:
prefix = my
endDocument:
随便看看,那么多www.yaoyao.com就知道试验成功了吧
总结:
通过了三篇文章:
SAX轻松入门(一),SAX轻松入门(二)--带验证的SAX解析 ,SAX轻松入门(三)--SAX过滤器(filter) 终于把SAX搞得差不多了,还有一些不太重要的问题如:DTDHandler,EntitryResolver,SAX写入等问题就不太费口水啦,下一次就该到了“重量级”的DOM上场了。
/*
DOM轻松入门(一) 2008-2-15
*/
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script>