老王学jsp之sax解析xml

第一天学习了dom解析xml的技术,dom是通过树形结构来解析的,一次读入整个文件,而sax是通过顺序的方式读取的,可以一次读入一个片段,效率更高

sax解析通过defaulthander的函数来解析,每个部分会自动触发相应的函数。所在包为org.xml.sax.helpers

1):文档开始 public void startDocument()
                  throws SAXException {} 不进行任何操作。

2):

public void startElement(String uri,
                         String localName,
                         String qName,
                         Attributes attributes)
                  throws SAXException
接收元素开始的通知。

默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的开始处采取特定的操作(如,分配新的树节点或将输出写入文件)。

参数:   uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。

    localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。

    qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。

    attributes - 附加到元素的属性。如果没有属性,则它将是空的 Attributes 对象。

3):

public void endElement(String uri,
                       String localName,
                       String qName)
                throws SAXException
接收元素结束的通知。

默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在每个元素的结束处采取特定的操作(如,结束树节点或将输出写入文件)。

指定者:
接口 ContentHandler 中的 endElement
参数:
uri - 名称空间 URI,如果元素没有任何名称空间 URI,或者没有正在执行名称空间处理,则为空字符串。
localName - 本地名称(不带前缀),如果没有正在执行名称空间处理,则为空字符串。
qName - 限定的名称(带有前缀),如果限定的名称不可用,则为空字符串。
4):
public void endDocument()
                 throws SAXException
接收文档结束的通知。

默认情况下,不执行任何操作。应用程序编写者可以在子类中重写此方法,以便在文档的结束处采取特定的操作(如,结束树或关闭输出文件)。

通过这几个函数就可以完成对xml文件的读取。

调用时需要先构造

public abstract class SAXParserFactory extends Object

定义工厂 API,使应用程序能够配置和获取基于 SAX 的解析器以解析 XML 文档。

SAXParserFactory 对象,

然后通过SAXParserFactory 构造 SAXParser

 SAXParser通过函数parse(String uri, HandlerBase hb)调用之前写好的defaulthander类。并且传入相关的xml文件的路径既可以了

实例:

xml文件:

<?xml version="1.0" encoding="GBK" ?>
<address>
<person id="名片" 编号="0001">
    <name>老王</name>
    <sex></sex>
    <phone>15520081263</phone>
</person>
<person id="名片" 编号="0002">
    <name>老大</name>
    <sex></sex>
    <phone>15520081263</phone>
</person>
</address>

saxtest代码:

import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;


public class saxTest {

    /**
     * @param args
     */
    public static void main(String[] args)  throws Exception{
        // TODO Auto-generated method stub
        SAXParserFactory factory=SAXParserFactory.newInstance();
        SAXParser saxParser=factory.newSAXParser();
        saxParser.parse("src/demo1.xml", new saxHander());

    }

}

saxHander代码:

import org.omg.CORBA.PUBLIC_MEMBER;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;


public class saxHander extends DefaultHandler {
    public void startDocument()//读取文档的开始
            throws SAXException{
        System.out.print("<xml? version="1.0" encoding="GBK"?>");
        
    }
    public void startElement(String uri,
            String localName,
            String qName,
            Attributes attributes)//表示属性
     throws SAXException{//接收元素开始的通知。 
        System.out.print("<");
        //输出名字
        System.out.print(qName);
        //输出属性
        for(int i=0;i<attributes.getLength();i++)
        {
            System.out.print(" "+attributes.getQName(i)+"="+attributes.getValue(i));
        }
        System.out.println(">");
        
    }
    public void characters(char[] ch,
            int start,
            int length)
     throws SAXException{//接收元素中字符数据的通知。属于最重要的部分
        System.out.print(new String(ch, start, length));
        
    } 
    public void endElement(String uri,
            String localName,
            String qName)
     throws SAXException{//接收元素结束的通知。
        System.out.print("</");
        System.out.print(qName);
        System.out.print(">");
        
    } 
    public void endDocument()//读取文档的结束
            throws SAXException{
        System.out.println("文档读取完毕");
        
    }

    
}

运行结果如下:【可以自行组织saxHander里面函数的操作,获得不同的输出结果】

<xml? version="1.0" encoding="GBK"?><address>

<person id=名片 编号=0001>

    <name>
老王</name>
    <sex></sex>
    <phone>
15520080563</phone>
</person>
<person id=名片 编号=0002>

    <name>
老大</name>
    <sex></sex>
    <phone>
15520080563</phone>
</person>
</address>文档读取完毕
原文地址:https://www.cnblogs.com/wanglei-134/p/3182643.html