天天看点

XML介绍及DOM解析&SAX解析——学习笔记一、XML简介二、XML元素VS节点三、DOM方式解析XML原理四、SAX方式解析XML原理五、JDOM工具解析六、DOM4J工具解析

目录

一、XML简介

(1)XML和HTML

(2)什么是XML

二、XML元素VS节点

三、DOM方式解析XML原理

四、SAX方式解析XML原理

五、JDOM工具解析

六、DOM4J工具解析

一、XML简介

(1)XML和HTML

         XML   被设计用来传输和存储数据。

         HTML 被设计用来显示数据。

(2)什么是XML

  • XML 指可扩展标记语言(EXtensible Markup Language).
  • XML 是一种很像HTML的标记语言
  • XML 的设计宗旨是传输数据,而不是显示数据。
  • XML 标签没有被预定义。需要自行定义标签
  • XML 被设计未具有自我描述性
  • XML 是W3C的推荐标准

二、XML元素VS节点

节点包括元素节点、属性节点、文本节点;

元素一定是节点,但节点不一定是元素;

XML介绍及DOM解析&SAX解析——学习笔记一、XML简介二、XML元素VS节点三、DOM方式解析XML原理四、SAX方式解析XML原理五、JDOM工具解析六、DOM4J工具解析

元素节点:student name sex age

属性节点:id="001"

文本节点:张三

三、DOM方式解析XML原理

基于DOM(Document Object Model,文档对象模型)解析方式,是把整个XML文档加载到内存,转换成DOM树,因此应用程序可以随机的访问DOM树的任何数据;

优点:灵活性强,速度快;

缺点:消耗资源比较多;

dom解析:

XML介绍及DOM解析&SAX解析——学习笔记一、XML简介二、XML元素VS节点三、DOM方式解析XML原理四、SAX方式解析XML原理五、JDOM工具解析六、DOM4J工具解析

student2.xml

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student>
		<name id="001">张三</name>
		<sex>男</sex>
		<age>20</age>
	</student>
	<student>
		<name id="002">李四</name>
		<sex>女</sex>
		<age>22</age>
	</student>
</students>           

DOM2.java

package com.java1234.xml;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class DOM2 {
	
	public static void printNodeAttr(Node node) {
		NamedNodeMap nameNodeMap = node.getAttributes();
		for(int i=0;i<nameNodeMap.getLength();i++) {
			Node attrNode = nameNodeMap.item(0);
			System.out.println(attrNode.getNodeName()+":"+attrNode.getFirstChild().getNodeValue());
		}
	}
public static void main(String[] args) {
		
		DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
		
		try {
			DocumentBuilder builder = factory.newDocumentBuilder();
			Document doc = builder.parse("src/student2.xml");
			NodeList nodeList = doc.getElementsByTagName("students");
			Element element = (Element)nodeList.item(0);
			NodeList nodes = element.getElementsByTagName("student");
			for(int i=0;i<nodes.getLength();i++) {
				Element e = (Element)nodes.item(i);
				System.out.println("姓名:"+e.getElementsByTagName("name").item(0).getFirstChild().getNodeValue());
				printNodeAttr(e.getElementsByTagName("name").item(0));
				System.out.println("性别:"+e.getElementsByTagName("sex").item(0).getFirstChild().getNodeValue());
				System.out.println("年龄:"+e.getElementsByTagName("age").item(0).getFirstChild().getNodeValue());
				System.out.println("==============");
			}
			
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}
           

四、SAX方式解析XML原理

SAX 的工作原理简单地说就是对文档进行顺序扫描,当扫描到文档(document)开始与结束、元素(element) 开始与结束、文档(document)结束等地方时通知事件处理函数,由事件处理函数做相应动作,然后继续同 样的扫描,直至文档结束。

优点:消耗资源比较少;适合大文件解析;

缺点:只能读取不能修改;开发复杂;

XML介绍及DOM解析&amp;SAX解析——学习笔记一、XML简介二、XML元素VS节点三、DOM方式解析XML原理四、SAX方式解析XML原理五、JDOM工具解析六、DOM4J工具解析

student.xml

<?xml version="1.0" encoding="UTF-8"?>

<student>
	<name id="001">张三</name>
	<sex>男</sex>
	<age>20</age>
</student>           

student.java

package com.java1234.model;

public class Student {

	private String id;
	private String name;
	private String sex;
	private int age;
	
        //...get set方法这里省略了,代码需加入
	
}
           

SAX02.java

package com.java1234.com;

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

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

public class SAX02 extends DefaultHandler{

	@Override
	public void startDocument() throws SAXException {
		System.out.println("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
	}

	@Override
	public void endDocument() throws SAXException {
		System.out.print("\n 扫描文档结束");
	}

	@Override
	public void startElement(String uri, String localName, String qName,
			Attributes attributes) throws SAXException {
		System.out.print("<");
		System.out.print(qName);
		if(attributes!=null){
			for(int i=0;i<attributes.getLength();i++){
				System.out.print(" "+attributes.getQName(i)+"=\""+attributes.getValue(i)+"\"");
			}
		}
		System.out.print(">");
	}

	@Override
	public void endElement(String uri, String localName, String qName)
			throws SAXException {
		System.out.print("</");
		System.out.print(qName);
		System.out.print(">");
	}

	@Override
	public void characters(char[] ch, int start, int length)
			throws SAXException {
		System.out.print(new String(ch,start,length));
	}

	public static void main(String[] args) throws Exception{
		SAXParserFactory factory=SAXParserFactory.newInstance();
		SAXParser parser=factory.newSAXParser();
		parser.parse("src/student.xml", new SAX02());
	}
}
           

执行结果:

XML介绍及DOM解析&amp;SAX解析——学习笔记一、XML简介二、XML元素VS节点三、DOM方式解析XML原理四、SAX方式解析XML原理五、JDOM工具解析六、DOM4J工具解析

五、JDOM工具解析

JDOM 是一种使用 XML(标准通用标记语言下的一个子集) 的独特 Java 工具包,用于快速开发 XML 应用 程序。

JDOM 官方网站:http://www.jdom.org/

准备jar包

XML介绍及DOM解析&amp;SAX解析——学习笔记一、XML简介二、XML元素VS节点三、DOM方式解析XML原理四、SAX方式解析XML原理五、JDOM工具解析六、DOM4J工具解析

解析文档demo

package com.java1234.com;

import java.io.IOException;
import java.util.List;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

public class JDOM02 {
	
	public static void main(String[] args) throws JDOMException, IOException {
		
		SAXBuilder builder = new SAXBuilder();
		Document document = builder.build("src/students.xml");
		Element students = document.getRootElement();
		
		List<Element> studentList  = students.getChildren("student");
		for(int i=0;i<studentList.size();i++) {
			Element student = (Element)studentList.get(i);
			String id = student.getAttributeValue("id");
			String name = student.getChildText("name");
			String sex = student.getChildText("sex");
			String age = student.getChildText("age");
			System.out.println("学号:"+id+";姓名:"+name+";性别:"+sex+";年龄:"+age);
		}
	}
	
}           

生成文档demo:

package com.java1234.com;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import org.jdom2.Attribute;
import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.output.XMLOutputter;

public class JDOM01 {
	public static void main(String[] args) {
		Element student = new Element("student");
		
		Attribute id = new Attribute("id","001");
		Attribute aa = new Attribute("aa","xx");
		student.setAttribute(id);
		student.setAttribute(aa);
		
		Element name = new Element("name");
		name.setText("张三");
		student.addContent("name");
		
		Element sex = new Element("sex");
		sex.setText("男");
		student.addContent(sex);
		
		Element age = new Element("age");
		age.setText("20");
		student.addContent(age);
		
		Document document = new Document(student);
		XMLOutputter out = new XMLOutputter();
		
		out.setFormat(out.getFormat().setEncoding("UTF-8"));
		
		try {
			out.output(document, new FileOutputStream("src/student2.xml"));
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
}
           

六、DOM4J工具解析

dom4j 是一个 Java 的 XMLAPI,类似于 jdom,用来读写 XML 文件的。dom4j 是一个非常非常优秀的 JavaXML API,具有性能优异、功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件,可以在 SourceForge 上找到它。在 IBMdeveloperWorks 上面可以找到一篇文章,对主流的 JavaXMLAPI 进行的性能、功能和易用性 的评测,dom4j 无论在哪个方面都是非常出色的。如今你可以看到越来越多的 Java 软件都在使用 dom4j 来读写 XML,特别值得一提的是连 Sun 的 JAXM 也在用 dom4j。这是必须使用的 jar 包, Hibernate 用它来读写配置文 件。

DOM4J 官方网站:http://www.dom4j.org

准备jar包

XML介绍及DOM解析&amp;SAX解析——学习笔记一、XML简介二、XML元素VS节点三、DOM方式解析XML原理四、SAX方式解析XML原理五、JDOM工具解析六、DOM4J工具解析

生成文档demo

package com.java1234.com;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;

public class DOM4J01 {
	public static void main(String[] args) {
		
		Document document = DocumentHelper.createDocument();
		Element studentElement=document.addElement("student");
		studentElement.addAttribute("id", "001");
		studentElement.addAttribute("aa", "xx");
		
		Element name=studentElement.addElement("name");
		name.setText("张三");
		Element sex=studentElement.addElement("sex");
		sex.setText("男");
		Element age=studentElement.addElement("age");
		age.setText("20");
		
		OutputFormat format=OutputFormat.createPrettyPrint();
		format.setEncoding("UTF-8");
		try {
			XMLWriter writer=new XMLWriter(new FileOutputStream("src/student3.xml"),format);
			writer.write(document);
			writer.close();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}
           

解析文档demo

package com.java1234.xml;

import java.util.Iterator;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class DOM4J02 {

	public static void main(String[] args) throws Exception{
		SAXReader saxReader=new SAXReader();
		Document document=saxReader.read("src/students.xml");
		Element rootElement=document.getRootElement();
		Iterator iter=rootElement.elementIterator();
		while(iter.hasNext()){
			Element studentElement=(Element)iter.next();
			System.out.println("学号:"+studentElement.attributeValue("id"));
			System.out.println("姓名:"+studentElement.elementText("name"));
			System.out.println("性别:"+studentElement.elementText("sex"));
			System.out.println("年龄:"+studentElement.elementText("age"));
			System.out.println("=========");
		}
	}
}