java中使用j2SE自带的SAX解析XML文件

来源:互联网 发布:手机gps虚拟定位软件 编辑:程序博客网 时间:2024/06/03 10:01

    java中的SAX解析XML文件的具体步骤基本分为五部:

        1.获取解析器factory

        2.通过factory获取sax解析器
        3.获取读取器
        4.注册事件处理器

        5.解析xml文件

具体代码如下:

public void saxDomXml() throws ParserConfigurationException,SAXException,IOException{//1.获取解析器factorySAXParserFactory factory=SAXParserFactory.newInstance();//2.通过factory获取sax解析器SAXParser sp=factory.newSAXParser();//3.获取读取器XMLReader xmlReader=sp.getXMLReader();//4.注册事件处理器//xmlReader.setContentHandler(new MyContentHandler());//xmlReader.setContentHandler(new MyContentHandler2());//5.解析xml文件xmlReader.parse("../MyXml.xml");}

下面这个类实现了ContentHandler这个接口,该接口默认的方法太多,一般的解析用不到,而且一旦调用了该接口里面的方法会全部实现,过于冗余繁琐。这个类实现的功能就是将一个XML文件完整的解析出来

//快捷键 Alt shift S 调出实现类的方法class MyContentHandler implements ContentHandler{/** * ch 数组为整个xml文件的内容 * start 当前标签提从哪个标签开始 * length 标签体长度 * */public void characters(char[] ch, int start, int length)throws SAXException {// 打印从ch数组里的start位置上取length个长度System.out.println("----打印标签内容---"+new String(ch,start,length));}public void startDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("解析开始");}public void endDocument() throws SAXException {// TODO Auto-generated method stubSystem.out.println("解析结束");}public void startElement(String uri, String localName, String name,Attributes arg3) throws SAXException {// TODO Auto-generated method stubSystem.out.println("开始标签"+name);}/** * name 传入的标签名 *  * **/public void endElement(String uri, String localName, String name)throws SAXException {// TODO Auto-generated method stub}public void setDocumentLocator(Locator arg0) {// TODO Auto-generated method stub}public void skippedEntity(String arg0) throws SAXException {// TODO Auto-generated method stub}public void startPrefixMapping(String arg0, String arg1)throws SAXException {// TODO Auto-generated method stub}public void endPrefixMapping(String arg0) throws SAXException {// TODO Auto-generated method stub}public void ignorableWhitespace(char[] arg0, int arg1, int arg2)throws SAXException {// TODO Auto-generated method stub}public void processingInstruction(String arg0, String arg1)throws SAXException {// TODO Auto-generated method stub}}//MyContentHandler

下面这个类继承自类DefaultHandler,该类实现EntityResolver, DTDHandler, ContentHandler, ErrorHandler这几个接口,不过类中方法没有做操作,当我们需要做具体的解析要求时,比如说只解析某个特定标签,或者只解析哪一个内容这种方式就很方便。

//适配器模式/** * 自定义特定的方法,例如只需要打印某个特定的标签、或者只打印第几个标签 * */class MyContentHandler2 extends DefaultHandler{private String eleName=null;private int count=0;@Overridepublic void startElement(String uri, String localName, String name,Attributes attributes) throws SAXException {// TODO Auto-generated method stubsuper.startElement(uri, localName, name, attributes);this.eleName=name;}@Overridepublic void characters(char[] ch, int start, int length)throws SAXException {super.characters(ch, start, length);//只打印标签为书名的内容,即所有的关于标签是"书名"的内容全部打印出来if ("书名" .equals(eleName)) {System.out.println(eleName+"\t标签的内容---"+new String(ch,start,length));}//只想打印第二个标签的内容if ("书名" .equals(eleName) && ++count==2) {System.out.println(eleName+"\t标签的内容---"+new String(ch,start,length));}}@Overridepublic void endElement(String uri, String localName, String name)throws SAXException {// TODO Auto-generated method stubsuper.endElement(uri, localName, name);eleName=null;}}//MyContentHandler2

XML文件内容如下:

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE 书架 SYSTEM "../book.dtd"><书架><书><书名>java</书名><作者>XX</作者><售价>14</售价></书><书><书名>C++</书名><作者>SS</作者><售价>14</售价></书></书架>

.dtd文件内容

<!ELEMENT 书架 (书+)><!ELEMENT 书 (书名,作者,售价)><!ELEMENT 书名 (#PCDATA)><!ELEMENT 作者 (#PCDATA)><!ELEMENT 售价 (#PCDATA)>