一个多月前看了一点使用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&newsid=2-355-436,结果在&这里就停住了,后边的东西都没有了,包括这个& 。
我记得一个与前刚看这个东西的时候,从网上rss中得到的url中的&没有用&替代,于是&是一行,前边后边各一行。事实上如果遇到<>等符号也是这样,我今天就遇到了。还没有搞清楚是怎么解决的。
除此之外,我想解析其中的CDATA中的内容,使用现在这个程序,只是打印了一堆空白。而我找到一个LexialHandler接口中有startCDATA和endCDATA,但是不清楚是怎么用的,网上也暂时没有找到。希望大家不吝赐教!