使用SAX解析xml文件

使用JAXP进行SAX解析(XMLReaderFactory、XMLReader 、SAXParserFactory与SAXParser)

一.我们通过XMLReaderFactory、XMLReader完成,步骤如下

1.通过XMLReaderFactory创建XMLReader对象  
XMLReader reader = XMLReaderFactory.createXMLReader();  
2. 设置事件处理器对象  
reader.setContentHandler(new MyDefaultHandler());  
3.读取要解析的xml文件  
FileReader fileReader =new FileReader(new File("src\\sax\\startelement\\web.xml"));  
4.指定解析的xml文件  
reader.parse(new InputSource(fileReader)); 

案例:通过案例对uri、localName、qName和attribute参数有更加深入的了解

1.首先创建要解析的web.xml文件,内容如下

<?xml version="1.0" encoding="UTF-8"?>  
<web-app version="2.5"   
    xmlns:csdn="http://java.sun.com/xml/ns/javaee"   
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee   
    http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">  
  <csdn:display-name></csdn:display-name>     
</web-app>  
<!--   
uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。  
xml namespace-xmlns  
localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。  
qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。  
attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。   
 --> 

2.创建解析测试类及事件处理的内部类代码如下


    package sax.startelement;  
      
    import java.io.File;  
    import java.io.FileReader;  
      
    import org.junit.Test;  
    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.DefaultHandler;  
    import org.xml.sax.helpers.XMLReaderFactory;  
      
    public class Demo3 {  
      
        @Test  
        public void test() throws Exception {  
            // 通过XMLReaderFactory创建XMLReader对象  
            XMLReader reader = XMLReaderFactory.createXMLReader();  
            // 设置事件处理器对象  
            reader.setContentHandler(new MyDefaultHandler());  
            // 读取要解析的xml文件  
            FileReader fileReader = new FileReader(new File(  
                    "src\\sax\\startelement\\web.xml"));  
            // 指定解析的xml文件  
            reader.parse(new InputSource(fileReader));  
        }  
      
        // 自定义的解析类,通过此类中的startElement了解uri,localName,qName,Attributes的含义  
        class MyDefaultHandler extends DefaultHandler {  
      
            @Override  
            public void startElement(String uri, String localName, String qName,  
                    Attributes attributes) throws SAXException {  
                super.startElement(uri, localName, qName, attributes);  
                System.out  
                        .println("--------------startElement开始执行--------------------------");  
                System.out.println("uri:::" + uri);  
                System.out.println("localName:::" + localName);  
                System.out.println("qName:::" + qName);  
                for (int i = 0; i < attributes.getLength(); i++) {  
                    String value = attributes.getValue(i);// 获取属性的value值  
                    System.out.println(attributes.getQName(i) + "-----" + value);  
                }  
                System.out  
                        .println("------------------startElement执行完毕---------------------------");  
            }  
      
        }  
    }  

3.程序运行的结果如下:

二.我们通过SAXParserFactory、SAXParser、XMLReader完成,步骤如下

1.使用SAXParserFactory创建SAX解析工厂
SAXParserFactory spf = SAXParserFactory.newInstance();
2.通过SAX解析工厂得到解析器对象
SAXParser sp = spf.newSAXParser();
3.通过解析器对象得到一个XML的读取器
XMLReader xmlReader = sp.getXMLReader();
4.设置读取器的事件处理器
xmlReader.setContentHandler(new BookParserHandler());
5.解析xml文件
xmlReader.parse("book.xml");


只是使用SAXParserFactory、SAXParser他们完成只需要如下3步骤


1.获取sax解析器的工厂对象
SAXParserFactory factory = SAXParserFactory.newInstance();
2.通过工厂对象 SAXParser创建解析器对象
SAXParser saxParser = factory.newSAXParser();
3.通过解析saxParser的parse()方法设定解析的文件和自己定义的事件处理器对象
saxParser.parse(new File("src//sax//sida.xml"), new MyDefaultHandler());

案例:解析出"作者"元素标签中的文本内容

1.需要解析的sida.xml文件

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE 四大名著[  
<!ELEMENT 四大名著 (西游记,红楼梦)>  
<!ATTLIST 西游记 id ID #IMPLIED>  
]>  
<四大名著>  
    <西游记 id="x001">  
        <作者>吴承恩</作者>  
    </西游记>  
    <红楼梦 id="x002">  
        <作者>曹雪芹</作者>  
    </红楼梦>  
</四大名著> 

2.解析测试类和事件处理器类的实现代码

package sax;  
  
import java.io.File;  
  
import javax.xml.parsers.SAXParser;  
import javax.xml.parsers.SAXParserFactory;  
  
import org.junit.Test;  
import org.xml.sax.Attributes;  
import org.xml.sax.SAXException;  
import org.xml.sax.helpers.DefaultHandler;  
  
public class SaxTest {  
  
    @Test  
    public void test() throws Exception {  
        // 1.获取sax解析器的工厂对象  
        SAXParserFactory factory = SAXParserFactory.newInstance();  
        // 2.通过工厂对象 SAXParser创建解析器对象  
        SAXParser saxParser = factory.newSAXParser();  
        // 3.通过解析saxParser的parse()方法设定解析的文件和自己定义的事件处理器对象  
        saxParser.parse(new File("src//sax//sida.xml"), new MyDefaultHandler());  
  
    }  
  
    // 自己定义的事件处理器  
    class MyDefaultHandler extends DefaultHandler {  
  
        // 解析标签开始及结束的的标识符  
        boolean isOk = false;  
  
        @Override  
        public void startElement(String uri, String localName, String qName,  
                Attributes attributes) throws SAXException {  
            super.startElement(uri, localName, qName, attributes);  
            // 当解析作者元素开始的时候,设置isOK为true  
            if ("作者".equals(qName)) {  
                isOk = true;  
            }  
        }  
  
        @Override  
        public void characters(char[] ch, int start, int length)  
                throws SAXException {  
            // TODO Auto-generated method stub  
            super.characters(ch, start, length);  
            // 当解析的标识符为true时,打印元素的内容  
            if (isOk) {  
                System.out.println(new String(ch, start, length));  
            }  
        }  
          
        @Override  
        public void endElement(String uri, String localName, String qName)  
                throws SAXException {  
            super.endElement(uri, localName, qName);  
            // 当解析作者元素的结束的时候,设置isOK为false  
            if ("作者".equals(qName)) {  
                isOk = false;  
            }  
        }  
  
    }  
} 

3.程序运行结果如下:


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值