使用SAX解析XML

一个多月前看了一点使用SAX解析XML的教程,不过这一个月来忙于其他的事,都忘得差不多了。今天把东西翻出来看一看,对于简单的处理应该还是不成问题的。只要会使用基本的语句

XMLReader parser = XMLReaderFactory.createXMLReader();

parser.setContentHandler(handler);

parser.parse();

再加上ContentHandler或者DefaultHandler,就完全可以解析基本的XML文档了,当然,水平有限,仅限于基本的很简单的文档。比如下边一个例子:

import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;


public class IPod extends DefaultHandler{
 
 private Writer wout;
 private boolean isName = false;
 
 public IPod(Writer wout){
  this.wout = wout;
 }
 public void characters(char[] text, int start, int length)throws SAXException {

//去掉//可以有条件的打印,如曲库.xml文件中的。加上可以打印全部,包括网络上的如:http://blog.csdn.net/HegcH/category/330705.aspx/rss
    try {
     if (isName){
       wout.write(text, start, length);
       wout.write("/n");
       isName = false;
      }else if(new String(text, start, length).equals("Name")){
       isName = true;
      }    
    }
    catch (IOException e) {
      throw new SAXException(e);
    }

  }
  public static void main(String[] args) {

    if (args.length <= 0) {
      System.out.println(
       "Usage: java IPod url"
      );
      return;
    }

    try {
      XMLReader parser = XMLReaderFactory.createXMLReader();


      Writer out = new OutputStreamWriter(System.out);
      ContentHandler handler = new IPod(out);
      parser.setContentHandler(handler);

      parser.parse(args[0]);

      out.flush();
    }
    catch (Exception e) {
      //System.err.println(e);
      e.printStackTrace();
    }

  }

}

我前几天装了一个iTunes,结果不会用,到是生成了一个“曲库.xml”,今天我觉得这个文件挺大的,用来搞一下XML的实验吧。就写了这个文件。这些东西当然是基础中的基础了。不过我正式解析的时候,总会出现连接超时的错误,xml文档原本有一句DOCTYPE,我去掉了,才正常解析的。

因为这个曲库.xml跟平常的ml有点不同,他的名称写在<key>中,后边再接个<string>或是<integer>写上具体内容,而平常的我想应该是用名称作为tagName,就改了下,如下是改动部分:

public void characters(char[] text, int start, int length)throws SAXException {

    try {
     if (isLink){
       wout.write(text, start, length);
       wout.write("/n");
       isLink = false;
     }   
    }
    catch (IOException e) {
      throw new SAXException(e);
    }

  }
  public void startElement (String namespaceURI, String localName, String qualifiedName, Attributes atts) throws SAXException{
   /*try {
    if (namespaceURI != null && !namespaceURI.equals(""))
     wout.write(namespaceURI);
   }
   catch (IOException e){
    System.err.println(e);
   }*/
   if (localName.equals("link")){
    isLink = true;
   }
  }

用来获取网上rss中的link部分。当然暂时使用sina的rss做实验是没有问题的。但是sina的rss有个comments一项,里边也是url,格式是:http://comment.news.sina.com.cn/cgi-bin/comment/comment.cgi?channel=kj&amp;newsid=2-355-436,结果在&amp;这里就停住了,后边的东西都没有了,包括这个&amp; 。

我记得一个与前刚看这个东西的时候,从网上rss中得到的url中的&没有用&amp;替代,于是&是一行,前边后边各一行。事实上如果遇到<>等符号也是这样,我今天就遇到了。还没有搞清楚是怎么解决的。

除此之外,我想解析其中的CDATA中的内容,使用现在这个程序,只是打印了一堆空白。而我找到一个LexialHandler接口中有startCDATA和endCDATA,但是不清楚是怎么用的,网上也暂时没有找到。希望大家不吝赐教!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值