解析xml并打印出所有的属性名称和文本内容
1 test-a.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<result>
<man>
<name>sky</name>
<age>18</age>
<sex>1</sex>
</man>
</result>
2 自定义handler的编写
package com.java.xml.SAX;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
/**
* 自定义sax解析器
* @author Administrator
*
*/
public class MySAXHandler extends DefaultHandler {
public void print(String str)
{
System.out.println(str);
}
public void startDocument() throws SAXException
{
print("sax event:start document");
}
public void endDocument() throws SAXException
{
print("sax event:end document");
}
public void startElement(String nameSpaceUri,
String localName,String qName,
Attributes attr) throws SAXException
{
print("sax event:start element["+qName+"]");
//如果有属性,打印属性
for (int i = 0; i < attr.getLength(); i++)
{
print("attribute:"+attr.getLocalName(i)+"value:"+attr.getValue(i));
}
}
public void endElement(String nameSpaceUri,
String localName,String qName) throws SAXException
{
print("sax event:end element["+qName+"]");
}
public void characters(char[] ch,int start,int length) throws SAXException
{
print("sax event:characters["+new String(ch,start,length).trim()+"]");
}
}
3 java sax访问,主要功能是遍历xml文件并按层次打印出所有的节点名称和文本内容
package com.java.xml.SAX;
import java.io.File;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
/**
* 为解决DOM的问题,出现了SAX.SAX ,事件驱动。
* 当解析器发现元素开始、元素结束、文本、文档的开始或结束等时,
* 发送事件,程序员编写响应这些事件的代码,保存数据。
* 优点:不用事先调入整个文档,占用资源少;
* SAX解析器代码比DOM解析器代码小,适于Applet,下载。
* 缺点:不是持久的;事件过后,若没保存数据,那么数据就丢了;
* 无状态性;从事件中只能得到文本,但不知该文本属于哪个元素;
* 使用场合:Applet;只需XML文档的少量内容,很少回头访问;机器内存少;
* @author Administrator
*
*/
public class SaxA {
/**
* dom4j解析
*/
public static void dom()
{
try
{
File xml = new File("D:/新的开始/学习笔记/java学习/xml解析/test-a.xml");
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
parser.parse(xml, new MySAXHandler());
// // 建立SAX 2解析器...
// XMLReader xr = XMLReaderFactory.createXMLReader();
//
// // 安装ContentHandler...
// xr.setContentHandler( new MySAXHandler() );
//
// // 解析文件...
// xr.parse( new InputSource(new FileReader("D:/新的开始/学习笔记/java学习/xml解析/test-a.xml" )));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
dom();
}
}
4 执行SaxA对象的main方法,输出如下:
sax event:start document
sax event:start element[result]
sax event:characters[]
sax event:start element[man]
sax event:characters[]
sax event:start element[name]
sax event:characters[sky]
sax event:end element[name]
sax event:characters[]
sax event:start element[age]
sax event:characters[18]
sax event:end element[age]
sax event:characters[]
sax event:start element[sex]
sax event:characters[1]
sax event:end element[sex]
sax event:characters[]
sax event:end element[man]
sax event:characters[]
sax event:end element[result]
sax event:end document
4 注意点:
给我的感觉,sax解析时也会长生空白的element,
(sax event:characters[]这种就是空白text-element).