java xml解析特殊符号_SAX解析XML出现特殊字符

这篇博客介绍了在Java中使用SAX解析XML时如何处理特殊字符,如<>&'"。通过转义这些字符,可以避免解析过程中出现错误。示例代码展示了如何在解析过程中收集和处理元素内容,特别关注了name和price元素的处理。
摘要由CSDN通过智能技术生成

importjava.io.InputStream;importjava.util.ArrayList;importjava.util.List;importjavax.xml.parsers.SAXParser;importjavax.xml.parsers.SAXParserFactory;importorg.xml.sax.Attributes;importorg.xml.sax.SAXException;importorg.xml.sax.helpers.DefaultHandler;public class SaxParseService extendsDefaultHandler{private List books = null;private Book book = null;private String preTag = null;//作用是记录解析时的上一个节点名称

/*** 特殊字符数量很多时方法1显然不实用此时可用转义来实现

* < <

* > >

* & &

* ' '

* " "

* 即将xml中的特殊文档全部替换为转义字符

* 如变成<thinking in java>。

* 但是对于这种情况解析过程会发生变化不是一次性解析

* 而是分三步先解析<然后是thinking in java然后是>

* 因此要注意想要获得中数据必须要用StringBuffer将这三部分加起来。

**/StringBuffer sb= newStringBuffer();public List getBooks(InputStream xmlStream) throwsException{

SAXParserFactory factory=SAXParserFactory.newInstance();

SAXParser parser=factory.newSAXParser();

SaxParseService handler= newSaxParseService();

parser.parse(xmlStream, handler);returnhandler.getBooks();

}public ListgetBooks(){returnbooks;

}

@Overridepublic void startDocument() throwsSAXException {

books= new ArrayList();

}

@Overridepublic void startElement(String uri, String localName, String qName, Attributes attributes) throwsSAXException {

sb.delete(0, sb.length()); //清除字符内容

if("book".equals(qName)){

book= newBook();

book.setId(Integer.parseInt(attributes.getValue(0)));

}

preTag= qName;//将正在解析的节点名称赋给preTag

}

@Overridepublic voidendElement(String uri, String localName, String qName)throwsSAXException {if("book".equals(qName)){

books.add(book);

book= null;

}

preTag= null;/**当解析结束时置为空。这里很重要,例如,当图中画3的位置结束后,会调用这个方法

,如果这里不把preTag置为null,根据startElement(....)方法,preTag的值还是book,当文档顺序读到图

中标记4的位置时,会执行characters(char[] ch, int start, int length)这个方法,而characters(....)方

法判断preTag!=null,会执行if判断的代码,这样就会把空值赋值给book,这不是我们想要的。*/}

@Overridepublic void characters(char[] ch, int start, int length) throwsSAXException {if(preTag!=null){//String content = new String(ch,start,length);

sb.append(ch,start,length);//字符相加

String content =sb.toString();if("name".equals(preTag)){

book.setName(content);

}else if("price".equals(preTag)){

book.setPrice(Float.parseFloat(content));

}

}

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值