XML的语法和解析

 

 

一.XML的语法格式,第一行是默认,一个xml文件有一个根目录,包含所有元素,
一对元素之间的是元素的文本(返回格式是String类型)如:<name>linsa</name>——name元素的文本是linsa
元素里面的是属性,如:<emp id="1">——emp元素的id属性是1
注意:XML根HTML不同,对大小写是敏感的,/是关闭标签,每一个元素都必须有

 

 

1.emplist.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<list>
	<emp id="1">
		<name>张三</name>
		<age>22</age>
	</emp>
	<emp id="2">
		<name>李四</name>
		<age>46</age>
	</emp>
</list>


2.练习

 

 

<?xml version="1.0" encoding="UTF-8"?>
<server>
	<!-- 配置和客户端连接相关的信息客户端传输数据的字符集服务端口等信息 -->
	<Connector URIEncoding="utf-8" port="8088" protocol="HTTP/1.1"/>
	<!-- 线程池的线程数 -->
	<Executor maxThreads="50"/>
</server>


二.XML解析方式有两种:SAX,DOM

 

 

 

 

package day11;
/**
 * 用来表示一个员工信息
 * 
 * VO value object值对象
 * 所谓值对象,就是当前类的每个实例就是用来保存一组数据使用。
 * @author soft01
 *
 */
public class Emp {
	private int id;
	private String name;
	private int age;
	public Emp(){
		
	}
	public Emp(int id, String name, int age) {
		this.id = id;
		this.name = name;
		this.age = age;
	}
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public String toString() {
		return id + "," + name + "," +age;
	}
	
}


1.SAX解析速度快,不能修改(SAX读取XML所有元素)

 

 

 

 

package day11;

import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.List;

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

/**
 * 解析XML
 * @author soft01
 *
 */
public class ParseXmlDemo {
	public static void main(String[] args) {
		List<Emp> list = new ArrayList<Emp>();
		/*
		 * 原来我们程序使用的数据都是写死在程序里的
		 * 这样带来的问题是数据发生改变就会修改源代码
		 * 这在实际开发中是极其不可取的!
		 * 
		 * 所以在实际开发中,我们通常的做法是将程序与
		 * 程序运行时需要的数据分离开,将数据保存到
		 * 一个文件中,程序运行时通过读取文件中的数据来运行。
		 * 这样将来数据有修改只需要在该文件中作出修改即可,
		 * 程序无需做任何改动。
		 * 
		 * 将emplist.xml文件中的员工信息读出来存入List集合。
		 * 
		 * 使用DOM解析XML的大致步骤
		 * 1:创建SAXReader
		 * 2:使用SAXReader读取XML文档并生成
		 * Document对象
		 * 这一步就是DOM耗时耗资源的地方,因为要
		 * 将XML文档全部读取完毕并以Document
		 * 对象存入内存。
		 * 3:通过Document获取根元素
		 * 4:按照XML文档结构从根元素开始逐级获取子元素
		 * 以达到获取XML文档数据的目的。
		 */
		try {
			//1
			SAXReader reader = new SAXReader();
			//2
//			reader.read(new File("emplist.xml"));
			Document doc = reader.read(new FileInputStream("emplist.xml"));
			System.out.println("读取XML文档完毕!");
			/*
			 * 3获取根元素
			 * Document提供的方法:
			 * Element getRootElement()
			 * 获取当前XML文档的根元素
			 * 
			 * org.dom4j下的Element的每一个实例
			 * 用于表示XML文档中的一个元素(一对标签)
			 */
			Element root = doc.getRootElement();
			System.out.println(root.getName());
			/*
			 * Element提供了获取当前元素信息的方法:
			 * 常用:
			 * 1:String getName()
			 * 		获取当前元素的名字
			 * 2:String getText()
			 * 		获取当前元素中间的文本数据(开始标签与结束标签中间的文本内容)
			 * 3:List elements()
			 * 		获取当前元素中的所有子元素
			 * 4:List elements(String name)
			 * 		获取当前元素中的所有同名子元素
			 * 5:Element element(String name)
			 * 		获取当前元素中指定名字的子元素
			 * 6:String elementText(String name)
			 * 		获取当前元素中指定名字的子元素中间的文本。
			 * 	String str = ele.elementText(name);
			 * 		效果等同于:
			 * 	String str = ele.element(name).getText()
			 * 7:Attribute attribute(String name)
			 * 		 获取当前元素中指定名字的属性
			 * 8:String attributeValue(String name)
			 * 		 获取当前元素中指定名字的属性的值
			 */
			List<Element> emplist = root.elements();
			for(Element empEle : emplist) {
				//获取id
				int id = Integer.parseInt(empEle.attributeValue("id"));
				System.out.println(id);
				//获取员工名字
				Element nameEle = empEle.element("name");
				String name = nameEle.getText();
				System.out.println(name);
				//获取员工年龄
				int age =Integer.parseInt(empEle.elementText("age"));
				System.out.println(age);
				Emp emp = new Emp(id,name,age,gender,salary);
				list.add(emp);
			}
			System.out.println("解析完毕!");
			list.forEach((e)->System.out.println(e));
		}catch(Exception e) {
			e.printStackTrace();
		}
	}
}


2.DOM解析速度慢,可修改(DOM生成XML文件)

 

 

 

 

package day11;

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

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

/**
 * 使用DOM生成XML文档
 * @author soft01
 *
 */
public class WriteXmlDemo {
	public static void main(String[] args) {
		List<Emp> list = new ArrayList<Emp>();
		list.add(new Emp(1,"张三",22));
		list.add(new Emp(3,"李四",23));
		/*
		 * 使用DOM生成一个XML文档的大致步骤:
		 * 1:创建一个Document实例,表示一个空白文档
		 * 2:向Document中添加根元素
		 * 3:按照XML文档结构要求逐级添加子元素和数据
		 * 		以形成该结构。
		 * 4:创建XMLWriter
		 * 5:使用XMLWriter将Document实例写出以形成
		 * xml文档。
		 */
		//1
		 Document doc = DocumentHelper.createDocument();
		 
		 /*
		  * 2添加根元素
		  * Document提供方法:
		  * Element addElement(String name)
		  * 向当前文档中添加根元素,并将该元素以Element实例
		  * 返回,以便继续操作根元素。
		  * 需要注意,该方法只能调用一次,因为一个XML文档中
		  * 只允许有一个根元素。
		  */
		 Element root = doc.addElement("list");
		 /*
		  * Element也提供了相关操作方法:
		  * 
		  * Element addElement(String name)
		  * 向当前元素中添加给定名字的子元素并返回
		  * 
		  * Element addText(String text)
		  * 向当前元素中添加文本,添加到该开始标签与结束标签之间
		  */
		 for(Emp emp : list) {
			 Element empEle = root.addElement("emp");
			 //添加<name>
			 Element nameEle = empEle.addElement("name");
			 nameEle.addText(emp.getName());
			 //添加<age>
			 Element ageEle = empEle.addElement("age");
			 ageEle.addText(emp.getAge()+"");
			 //添加id属性
			 empEle.addAttribute("id", emp.getId()+"");
		 }
		 XMLWriter writer = null;
		 try {
			 writer = new XMLWriter(new FileOutputStream("myemp.xml"),OutputFormat.createPrettyPrint());
			 writer.write(doc);
			 System.out.println("写出完毕!");
		 }catch(IOException e) {
			 e.printStackTrace();
		 }finally {
			 if(writer!=null) {
				 try {
					 writer.close();
				 }catch(IOException e) {
					 e.printStackTrace();
				 }
			 }
		 }
	}
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linsa_pursuer

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值