前言:DOM和SAX是跨语言的XML的解析准备,在Java 中使用却没有那么方便。Java 拥有自己的JDOM 和DOM4J(DOM for Java),这两个是专门为Java语言提供的解析工具,使用起来很方便,本文首先来介绍一下运用JDOM下的DOM和SAX分别来实现对XML文件元素的遍历。
1、使用DOM方式。
(1)首先我们有一个XML文件,存储student 元素:
xsi:schemaLocation="http://www.itcast.cn/xml students.xsd">
zhangSan
23
male
(2)实现遍历:
public class Demo {
@Test
public void method() throws Exception {
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();//创建解析器工厂
DocumentBuilder builder = factory.newDocumentBuilder(); //通过工厂得到解析器
Document doc = builder.parse(new File("src/students.xml"));//通过解析器解析XML文件,得到Document对象
// 遍历Document
Element root = doc.getDocumentElement(); //得到根元素
NodeList stuNodeList = root.getElementsByTagName("student"); //得到子元素集合
//循环遍历stuNodeList,获取每个student元素
for(int i = 0; i < stuNodeList.getLength(); i++) {
Node node = stuNodeList.item(i); //按角标依次得到集合中的子元素
Element stuEle = (Element) node;//因为stuNodeList中都是学生元素,所以可以强制转换
// 获取stuEle元素的名称number属性的值。
String number = stuEle.getAttribute("number");
// 获取stuEle的所有名为name的子元素,返回值为NodeList,再调用子元素的getTextContent()来获取元素的文本内容
String name = stuEle.getElementsByTagName("name").item(0).getTextContent();
String age = stuEle.getElementsByTagName("age").item(0).getTextContent();
String sex = stuEle.getElementsByTagName("sex").item(0).getTextContent();
System.out.println(number + ", " + name + ", " + age + ", " + sex);
}
}
}
2、使用SAX方式。
依然使用上边的XML文件。
public class Demo {
@Test
public void method() throws Exception {
SAXParserFactory factory = SAXParserFactory.newInstance(); //创建解析器工厂
SAXParser parser = factory.newSAXParser(); //创建解析器
// 解析方法需要两个参数,一个是xml文件,一个是处理器对象
parser.parse(new File("src/students.xml"), new MyHandler());
}
}
// 自定义SAX处理器,相应方法在解析过程中被调用
class MyHandler extends DefaultHandler {
@Override
public void startDocument() throws SAXException { //重写DefaultHandler方法,当开始解析文档时调用此方法
System.out.println("开始解析XML文件");
}
@Override
public void endDocument() throws SAXException { //当文档解析结束后调用此方法
System.out.println("XML解析结束");
}
@Override
public void startElement(String uri, String localName, String qName, //开始解析元素时调用此方法
Attributes attributes) throws SAXException {
System.out.println("开始解析元素:" + qName);
}
@Override
public void endElement(String uri, String localName, String qName)//解析元素结束时调用本方法
throws SAXException {
System.out.println("结束解析元素:" + qName);
}
public void characters(char[] ch, int start, int length) throws SAXException { //当解析字符时调用此方法
String str = new String(ch, start, length);
str.trim();
if(!str.isEmpty()) {
System.out.println(str);
}
}
}
小结:DOM解析方式是将XML文档作为一个对象整体保存在内存中,有解析结果,之后从内存中对文档进行操作,因为是整体保存,所以可能会因为文件过大导致内存溢出;SAX解析没有解析结果,在解析XML的过程中处理数据,解析完一条立即释放资源去解析下一条。
所以,SAX的优点是:解析的XML文件没有大小限制,解析速度快;缺点是:因为解析是一行一行的处理的,数据解析之后就丢失了,元素与元素之间的结构关系没有保留下来,不适合对XML进行增删改查。