xml学习心得笔记

1 XML语法

1.1 XML用途

XML,(Extensible Markup Language)可扩展标记语言,独立于软件、硬件的信息传输工具,应用于web开发,常用于简化数据的存储、共享(传输)、跨平台(系统)、跨语言(各种语言都能用)。

【个人见解】:xml类似于正则表达式,不是sum公司的,是个独立的东西;

1.2 基本语法

1.2.1 XML指令

PI(processing instruction)处理指令,指挥解析引擎如何解析XML文档内容。
e.g ---自动生成(永远在xml文档的第一行)

【个人见解】:
  • 在XML中,所有的处理指令都是以结尾,中间是处理指令的名称;
  • PI要求必须指定一个version属性,可选standalone---是否允许使用外部xml文件声明(yes/no-默认)、encoding---指作者使用的字符编码格式(UTF-8、gb2312);

1.2.2 元素、属性

xml元素---从开始标签~结束标签的部分,元素可以包含其他元素、文本、或者两者混合物,元素也可以拥有属性。

                           //dabasource--一个元素,其包含其他元素,例如property
    
         jdbc:[email protected]:1521:tarena           //property--一个元素,也可以包含元素、文本
    
    openlab        //元素也可以有属性,例如property具有name属性
    open123

属性(Attribute)---提供关于元素额外(附加)信息,通常这些信息不属于数据组成部分,但是对于处理这个元素得应用程序来说是很重要的。


【个人见解】:如果属性内部需要用到“ ”,则属性外部就要用‘ ’

1.2.3 大小写敏感

XML文档中对大小写很敏感,是不一样的,打开标签和关闭标签必须写成相同的,必须成对出现。

1.2.4 元素必须要有关闭标签


1.2.5 必须要有根元素(根元素只能有一个)


1.2.6 元素必须正确嵌套(开始标签、结束标签不能在不同元素之间交叉定义)


1.2.7 实体引用

实体---常用的短语、键盘字符、文件、数据库记录、任何包含数据的项。在XML中,有时实体内包含了一些字符,如& < > " ' 等,这些均是需要转义的,否则会被XML解析器生成错误。

xml常用实体引用
xml学习心得笔记_第1张图片


【个人见解】:实体还是可以自己声明的

1.2.8 CDATA段

格式:< ! [ CDATA [   文本内容 ] ] >
xml学习心得笔记_第2张图片


2 XML解析方式

2.1 SAX解析方式

SAX(simple API for XML)解析,逐行扫描文档,一边扫描一边解析。

    优点:解析可以立即开始,速度快、没有内存压力;
    缺点:不能对节点进行修改;


2.2 DOM解析方式

DOM(Document Object Model)文档对象模型,解析过程中,先将文档中的所有元素,按照其出现的层次关系,解析成一个个Node对象(节点)。

    优点:将XMl文件在内存中构建树形结构,可以遍历、修改节点;
    缺点:若文件较大,则会造成内存有压力,解析时间会比较长;

【个人见解】:相对于DOM,SAX可以在解析文档的任意时刻停止解析;另外,Android解析XML文件使用的是SAX。

3 读取XML

package XML;

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

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader; //使用SAXReader需要导入dom4j-full.jar包,其是DOM4J类的一个核心API,用于读取XML文档
/*
 * DOM4J是一个java的XML API,类似于JDOM,用于读写XML文件的。DOM4J是一个非常优秀的java XML API,是一个开源的软件
 */

/*
 * 通过DOM来解析xml(不管怎么说也得读嘛,所以必须得通过SAXReader读)
 *
 * 解析xml文件的流程:
 *  1、创建SAXReader,用于读取xml文件
 *  2、指定xml文件使得SAXReader读取,并解析文档对象Document
 *  3、获取根元素/根标签/根节点
 *  4、获取每个元素,从而达到解析的目的(没有固定的写法)
 */
public class xmlDemo {
	//要想解析xml文件,则必须读xml文件,即定义IO流,则必须用try-catch
	public static void main(String[] args) {
		try{
			//1、创建SAXReader
			SAXReader reader=new SAXReader(); //字符流(以Reader结尾,且xml文件里边存放的都是字符)
		
			//2、读取指定xml文件
			File xmlFile=new File("emp.xml");
			/*
			 * 常用的读取方法:
			 * Document read(InputStream in) //字节输入流
			 * Document read(Reader read) //Reader-字符输入流 父类
			 * Document read(File file) //直接给定一个文件
			 */
			Document doc=reader.read(xmlFile);
			/*
			 * read方法的作用:
			 * 1、读取给定的xml,并将其解析转换成一个Document对象
			 * 2、实际上这里已经完成了对整个xml解析的工作,并将所有的内容封装到一个Document对象中
			 * 3、Document对象可以描述当前xml文档
			 */
			/*
			 * Document对象是一颗文档树的根,为我们提供访问文档数据的最顶层的入口;
			 * 当我们得到Document对象后,就相当于得到整个XMl描述的树结构,接下来第一步就是,先获取根元素
			 */
			
			//3、获取根元素
			Element root=doc.getRootElement(); //Document提供了一个方法Element getRootElement()获取根标签(一个Element对象)
			/*
			 * Element类,Element-用于描述XML中的一个元素
			 */
			
			//4、获取下级元素(【注意】:只管向下一级)
			//【补充知识点】:
			/*
			 * Element类,提供了一系列方法:
			 * 1、Element element(String name);//获取当前元素下,第一个叫这个指定名字的子元素(还是一个Element对象)
			 * 2、List elements(); //获取当前元素下,所有的子元素(elements有很多重载方法)
			 * 3、List elements(String name); //获取当前元素下,所有同名(即都是叫指定的这个名字)的子元素
			 * 4、String getName(); //获取当前元素的名字
			 * 5、String getText(); //获取当前元素的文本节点(即开始、结束标签之间的文本)
			 * 6、String getTextTrim(); //在上边基础上,去除文本两端的空格
			 * 7、Attribute attribute(int index); //获取当前元素的指定属性,从0开始
			 * 8、Attribute attribute(String name); //获取当前元素的指定名字的属性 
			 */		
			List elements=root.elements(); //返回所有子元素(Element对象)集合,
													//这边返回的是每个emp元素,即该集合中保存的是多个emp元素,但是只是一个Element对象	
			/*
			 * 创建一个集合,用于保存xml中的每个用户的信息;
			 * 【1】先将用户信息取出;
			 * 【2】再创建一个Emp实例,将信息设置到该实例的对应属性上
			 * 【3】最终将所有的emp对象存入该集合中
			 */
			List list=new ArrayList();
			/*
			 * 遍历出每一个emp元素(标签)
			 */
			for(Element emp:elements){ //从elements集合中,遍历数据存到emp变量中(emp是Element类型)	
				//解析emp标签
				/*
				 * 【1】首先,获取当前emp标签下,名为name的子标签
				 * 【2】其次,获取前后标签中间的文本
				 */
				//获取名字
//				Element ename=emp.element("name");
//				String name=ename.getText();//确保当前标签的开始结束标签中间是文本
//				String name=ename.getTextTrim();//将中间文本的两端空去掉
				
				//或者:
				/*
				 * String elementText(String name)
				 * 获取当前标签中,名为给定名字的子标签中间的文本。该方法与上边获取“name”的两句话等效
				 */
				String name=emp.elementText("name");
				
				//获取年龄(由于上边方法返回的是String类型,所以这里需要将String类型转换为int类型)
				String ageStr=emp.elementText("age");
				int age=Integer.parseInt(ageStr);
				
				String gendar=emp.elementText("gendar");
				
				String doubleStr=emp.elementText("salary");
				double salary=Double.parseDouble(doubleStr);
				
				//创建Emp对象,用于保存信息
				Emp e=new Emp();
				e.setName(name);
				e.setAge(age);
				e.setGendar(gendar);
				e.setSalary(salary);
				
				/*
				 * 通过Element获取元素属性:
				 * 1、Attribute attribute(int index);//获取当前标签的第几个属性
				 * 2、Attribute attribute(String name);//获取当前标签的name属性
				 */
				/*
				 * Attribute类:(其每个实例,都描述了(某个元素的)某个 属性信息 )
				 * 【根据Attribute对象,通常我们会获取其对应的属性名、属性值】,具体方法:
				 * 1、String getName(); //获取属性的名字
				 * 2、String getValue(); //获取属性的值 
				 */	
				//获取id属性
				Attribute attr=emp.attribute("id");
				int id=Integer.parseInt(attr.getValue());
				e.setId(id);
				
				//将Emp对象存入集合
				list.add(e);
			}
			
			System.out.println("解析了"+list.size()+"个员工信息");
			
			//循环输出每个员工的信息
			for(Emp e:list){
				System.out.println(e);
			}
			
		}catch(Exception e){
			
		}
	}

}

4 写出XML

package XML;

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

import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
/*
 * 使用DOM4J,可以自行构建Document对象,并组建树状结构来描述一个XML文档,并使用DOM4J将其写出到一个文件中
 */

/*
 * 使用DOM写出一个XML
 * 
 * 生成XML文件的基本步骤:
 * 1、创建Document对象
 * 2、为Document添加根节点
 * 3、为根节点组建树状结构(根据具体需求,不一定需要)
 * 4、Document构建好后,通过创建XMLWriter来输出
 * 5、为XMLWriter指定写出目标路径
 * 6、写出XML
 */
public class writeXML {
	public static void main(String[] args) {
		try{	
		//1、创建Document对象
		/*
		 * DOM4J提供了一个类:DocumentHelper,
		 * 该类提供了一个静态方法:static Document createDocument()---用于创建Document对象
		 */
		Document doc=DocumentHelper.createDocument();
		
		//2、添加根元素(由于之前了解知道。Element通常是用来描述XML中的一个元素的,所以我们要向Document对象添加一个Element,来表示根元素)
		/*
		 * Document提供了一个方法:
		 * Element addElement(String name) //向Document中添加,指定名字的根元素
		 * 【1】:该方法只能调用一次,否则会抛出异常---“文档已存在根元素”
		 * 【2】:根元素添加完毕后,该方法返回---根元素所对应的Element对象,以便后续根据根元素组织整个树
		 */
		Element root=doc.addElement("list");
		
		//3、向根元素中添加子元素
		/*
		 * Element类提供一系列方法:(供应添加子元素、属性、文本等等)
		 * 1、Element addElement(String name) //向该元素添加子元素,返回其对应的element对象
		 *     【注意】这个方法可以调用多回(因为根元素下边可以有很多个子emp元素)   
		 * 2、Element addText(String text) //向元素得文本节点,追加 文本信息
		 * 3、Element setText(String text) //向元素得文本节点,设置 文本信息
		 * 4、Element addAttribute(String name,String value) //给当前元素添加给定属性名字,以及对应的属性值(类似于StringBuilder的append方法)
		 *      【目的】:降低了连续添加元素时的代码复杂度
		 */
		//这里先自己手动创建一个集合,存放将要放入xml文件中的几个emp信息
		List list=new ArrayList();
		list.add(
				new Emp(1,"霍霍",12,"男",3600.56));
		list.add(
				new Emp(2,"霍霍2",23,"女",2600.56));
		list.add(
				new Emp(3,"霍霍3",36,"男",8600.56));
		list.add(
				new Emp(4,"霍霍4",56,"女",15600.56));
		list.add(
				new Emp(5,"霍霍5",8,"男",10.56));
		//添加完根元素后,循环(从设置的list中将每个emp)写出到给定的xml文件中
		for(int i=0;i





















你可能感兴趣的:(xml学习心得笔记)