SAX轻松入门(三)--SAX过滤器(filter)

/*
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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值