XML入门介绍

XML 简介

一.概念:Extensible Markup Language 可扩展标记语言
(1)可扩展:标签都是自定义的
(2)功能:存储数据。<1>配置文件 <2>在网络中传输
(3)xml和html的区别:
3.1、xml标签都是自定义的,html标签都是预定义的
3.2、xml语法严格,html语法松散。
3.3、xml是存储数据的,html是展示数据的。
(4)w3w:万维网联盟——xml的技术维护组织

二.语法:
1.基本语法
1.2 xml文档后缀名
1.3 xml第一行必须定义为文档声明
1.4 xml文档中仅有一个跟标签
1.5 属性指必须使用引号单双引度可以)
1.6 标签必须正确关闭
1.7 xml标签名称区分大小写
2.快速入门

  <?xml version='1.0' ?>
  	 <users>
  		<user id=1>
  			<name>zhangsan</name>
  			<age>12</age>
  			<gender>male</gender>
  			<br/>
  		</user>
  		<user id=2>
  			<name>lisi</name>
  			<age>21</age>
  			<gender>female</gender>
  			<br/>
  		</user>
  	</users>
  

3.组成部分:
1)文档声明:
1>格式:<?xml 属性列表?>
2>属性列表:
a.version:版本号,必须的
b.encoding:编码方式,告知解析引擎当前文档使用的字符集,默认ISO-8859-1
c:standalone:是否独立,yes:不依赖其他文件,no:依赖其他文件
2)指令:结合CSS的。
3)标签:标签名称自定义
1>名称可以包含字符、数字以及其他的字符
2>名称不能以数字或标点符号开始
3>名称不能以字母xml(或XML/Xml等)开始
4>名称不能包含空格

4)属性:id属性值唯一
5)文本;CDATA区:该区域中的数据会被原样展示,格式:<![CDATA[数据]]>

三、约束:规定xml文档的书写规则
1.作为框架的使用者(程序员)的掌握要求:
1)能够在xml中引入约束文档
2)能够简单的阅读约束文档
2.分类
1)DTD:一种简单的约束技术
2)Schema:一种复杂的约束技术

注意! 笔者本文用到了外部jar包:dom4j-2.0.0.jar
dom4j是一个Java的XML API,是jdom的升级品,用来读写XML文件的。dom4j是一个十分优秀的JavaXML API,具有性能优异、功能强大和极其易使用的特点,它的性能超过sun公司官方的dom技术,同时它也是一个开放源代码的软件,可以在SourceForge上找到它。在IBM developerWorks上面还可以找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评测,所以可以知道dom4j无论在哪个方面都是非常出色的。如今可以看到越来越多的Java软件都在使用dom4j来读写XML,特别值得一提的是连Sun的JAXM也在用dom4j。这已经是必须使用的jar包, Hibernate也用它来读写配置文件

XML的解析

XML解析:
SAX解析:逐行解析 缺点:不能增删操作。优点:快。 应用:移动端
DOM解析:整体文档解析。缺点:慢。优点:可以增删操作。应用:PC端

DOM4J解析XML文档的大致步骤:
1、创建SAXReader(注意:不要因为这个单词中有SAX就人为DOM4J是SAX解析,DOM4J是DOM解析,有这个名字的类而已)
2、使用SAXReader读取xml文档并生成Document对象。这一步也是DOM解析耗时耗资源的体现,因为要将XML文档全部读取
完毕,并存入到Document对象中。
3、通过Document获取根元素
4、按照文档的层级结构从根元素开始逐级获取子元素,已达到遍历XML文档数据的目的。

**本实例使用的是名为Emp的标准类,在文章末尾 **

package SE05.n1xml;

import java.util.ArrayList;
import java.util.List;

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

public class Demo02ParseXML {
	public static void main(String[] args) {
		List<Emp>list=new ArrayList<Emp>();//Emp是一个自己做的一个标准类
		SAXReader reader=new SAXReader();//dom4j提供SAXReader
		try {
			Document doc=reader.read("D:\\Java\\ZhongXin\\src\\SE05\\n1xml\\xml\\emplist.xml");
		/*
		 * Element的每一个实例用于表示xml文档中的一对标签,其提供了很多获取其表示的标签信息的方法;
		 * 		String getName();获取当前标签的名字
		 * 		String getText();获取当前标签中间的文本
		 * 		String elementText(String name);获取当前标签中指定名字的子标签中间的文本
		 * 		Element element(String);获取当前标签中指定名字的子标签
		 * 		List elements();获取当前标签的所有子标签
		 * 		List elements(String name);获取当前标签中指定的同名子标签
		 * 		
		 */
//			根标签root:<list>....</list>
			Element root=doc.getRootElement();
//			获取<list>标签中的所有<emp>标签
			List<Element>empList=root.elements();
//			遍历empList集合,将每个<emp>标签中的员工信息解析出来,并以Emp实例的形式存入list集合
			for(Element empEle:empList) {
				System.out.println(empEle.getName());
//				获取名字
				Element nameEle=empEle.element("name");
				String name=nameEle.getText();
//				获取年龄
				Element ageEle=empEle.element("age");
				int age=Integer.parseInt(ageEle.getText());
//				获取性别
				String gender=empEle.elementText("gender");
//				获取工资
				int salary=Integer.parseInt(empEle.elementText("salary"));
//				获取id:Element有快捷的获取指定名字属性值的方法
				int id=Integer.parseInt(empEle.attributeValue("id"));
				Emp emp=new Emp(id,name,age,gender,salary);
				list.add(emp);
			}
			System.out.println("解析完毕");
			for(Emp e:list) {
				System.out.println(e);
			}
		} catch (DocumentException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
}

生成XML文档

生成一个XML文档的大致步骤:
1、创建一个Document对象表示空白文档
2、向Document对象中添加根元素
3、按照预定生成的XML文档的结构依次从根元素开始逐级添加子元素
4、创建xmlWriter
5、通过xmlWriter将给定的Document对象写出以形成XML文档

package SE05.n1xml;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
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;

public class Demo03WriteXML {
	public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException {
		List<Emp>list=new ArrayList<Emp>();
		list.add(new Emp(1,"张三",22,"男",5000));
		list.add(new Emp(2,"李四",23,"男",5001));
		list.add(new Emp(3,"王五",24,"男",5002));
		list.add(new Emp(4,"赵六",25,"男",5003));
		list.add(new Emp(5,"陈七",26,"男",5004));
		list.add(new Emp(6,"王八",27,"男",5005));
//		1、创建一个Doucument对象表示空白文档
		Document doc=DocumentHelper.createDocument(); 

//		2、Document提供了添加根元素的方法:
//			Element addElement(String name);该方法只能调用一次
		Element root=doc.addElement("list");
/*
 * 将每个员工信息以<emp>标签形式添加到根标签中
 * 
 * Element提供了向标签添加信息的相关方法:
 * 		Element addElement(String name);向当前标签中添加指定名字的子标签,该方法可多次调用
 * 		Element addText(String text);向当前标签中添加文本信息,返回的还是当前标签
 * 		Element addAttribute(String name,String value);向当前标签中追加指定名字及对应值的属性
 */
		for(Emp emp:list) {
//			向根标签中添加<emp>标签
			Element empEle=root.addElement("emp");
//			添加<name>
			Element nameEle=empEle.addElement("name");
			nameEle.addText(emp.getName());
			
			empEle.addElement("gender").addText(emp.getGender());
			empEle.addElement("salary").addText(emp.getSalary()+"");
			empEle.addAttribute("id", emp.getId()+"");

		}
		
		try {
			XMLWriter writer =new XMLWriter(new FileOutputStream("D:\\Java\\ZhongXin\\src\\SE05\\n1xml\\xml\\emplist.xml"),OutputFormat.createCompactFormat());
			writer.write(doc);
			System.out.println("写出完毕");
			writer.close();
		} catch (IOException e) {
			// TODO 自动生成的 catch 块
			e.printStackTrace();
		}
	}
}

Emp类

package SE05.n1xml;

public class Emp {
	private int id;
	private String name;
	private int age;
	private String gender;
	private int salary;
	public Emp(int id, String name, int age, String gender, int salary) {
		super();
		this.id = id;
		this.name = name;
		this.age = age;
		this.gender = gender;
		this.salary = salary;
	}
	public Emp() {
		super();
	}
	@Override
	public String toString() {
		return "Emp [id=" + id + ", name=" + name + ", age=" + age + ", gender=" + gender + ", salary=" + salary + "]";
	}
	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 getGender() {
		return gender;
	}
	public void setGender(String gender) {
		this.gender = gender;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	
	
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值