您的位置:首页 > 其它

JDOM实现XML文件的遍历

2015-12-14 22:57 204 查看
前言:DOM和SAX是跨语言的XML的解析准备,在Java 中使用却没有那么方便。Java 拥有自己的JDOM 和DOM4J(DOM for Java),这两个是专门为Java语言提供的解析工具,使用起来很方便,本文首先来介绍一下运用JDOM下的DOM和SAX分别来实现对XML文件元素的遍历。

1、使用DOM方式。

  (1)首先我们有一个XML文件,存储student 元素:

<span style="font-size:14px;">
<?xml version="1.0" encoding="utf-8"?>

<students xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
		xmlns="http://www.itcast.cn/xml"  <!-- 默认命名空间 -->
			xsi:schemaLocation="http://www.itcast.cn/xml students.xsd">
	<student number="ITCAST_1001">
	  <name>zhangSan</name>
	  <age>23</age>
	  <sex>male</sex>
	</student>
</students>

</span>
  (2)实现遍历:

<span style="font-size:14px;">
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);
		}
	}
}

</span>
2、使用SAX方式。

  依然使用上边的XML文件。

<span style="font-size:14px;">
 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);
		}
	}
}

</span>
  小结:DOM解析方式是将XML文档作为一个对象整体保存在内存中,有解析结果,之后从内存中对文档进行操作,因为是整体保存,所以可能会因为文件过大导致内存溢出;SAX解析没有解析结果,在解析XML的过程中处理数据,解析完一条立即释放资源去解析下一条。

  所以,SAX的优点是:解析的XML文件没有大小限制,解析速度快;缺点是:因为解析是一行一行的处理的,数据解析之后就丢失了,元素与元素之间的结构关系没有保留下来,不适合对XML进行增删改查。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: