简介:
JAXP是sun公司提供的解析xml文件的能力,包含dom解析和sax解析方式.
DOM和SAX解析的优缺点:
DOM:根据xml的层级结构在内存中分配一个属性结构,将xml的标签,属性,文本都当做对象
优点:很方便的进行节点的增删改
缺点:如果文件过大,会造成内存溢出
SAX:采用事件驱动,边读边解析,从上到下一行一行的解析,解析到某一个对象将对象名称返回
优点:不会出现内存溢出,方便实现查询
缺点:不能进行增删改操作.
JASP的SAX解析方式解析
sax不能实现增删改操作,只能进行查询操作
当解析到开始标签的时候,会自动执行startElement方法,返回开始标签名
当解析到文本时候,会自动执行characters方法,返回文本内容
当解析到结束标签的时候,会自动执行endElement方法,返回结束标签名
范例
获取解析器并解析
public class SaxDemo
{
public static void main(String[] args) throws Exception
{
// 获取SAX解析器工厂
SAXParserFactory saxParserFactory = SAXParserFactory.newInstance();
// 获取解析器
SAXParser saxParse = saxParserFactory.newSAXParser();
// 进行解析
DefaultHandler handler = new SaxHandler2();
saxParse.parse("schema/person2.xml", handler);
}
}
解析:
需要继承DefaultHandler类,重写startElement,characters,endElement三个主要方法
startElement:当解析器执行到开始标签时自动执行,可获得开始标签名和属性数组
characters:当解析器执行到文本标签时自动执行,可获得(char[] ch, int start, int length),得到文本内容
endElement:当解析器执行到开始标签时自动执行,可获得结束标签名
/**
* Sax解析器执行Handler,打印全部XML内容
*/
public class SaxHandler1 extends DefaultHandler
{
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
StringBuilder sb = new StringBuilder();
sb.append("<").append(qName);
for (int i = 0; i < attributes.getLength(); i++)
{
String attrName = attributes.getLocalName(i);
String attrValue = attributes.getValue(i);
sb.append(" ").append(attrName).append("=\"").append(attrValue).append("\"");
}
sb.append(">");
System.out.print(sb);
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException
{
System.out.print(new String(ch, start, length));
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException
{
System.out.print("</" + qName + ">");
}
}
/**
* Sax解析器执行Handler,获取第2个friend的名字
*/
public class SaxHandler2 extends DefaultHandler
{
private boolean flag = false;
private int index = 1;
// startElement,characters,endElement是按顺序执行的
@Override
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException
{
if ("friend".equals(qName))
{
flag = true;
index++;
}
}
@Override
public void characters(char[] ch, int start, int length) throws SAXException
{
if (flag && index == 2)
{
System.out.print(new String(ch, start, length));
}
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException
{
flag = false;
}
}