Java小白修炼手册--第二阶段--Java SE--XML语法及解析方式

目录

XML:

概述:

用途:

XML语法

XML处理指令:

元索和属性:

大小写敏感:

元索必须有关闭标签:

必须有根元素:

元素必须正确嵌套:

实体引用:

CDATA段:

XML解析:

XML解析方式:

SAX解析方式:

DOM解析方式:

读取XML:SAXReader读取XML文档:

Document方法:

Element 方法:

Attribute 方法:


XML:

概述:

XML指可扩展标记语言( EXtensible Markup Language ), 是独立于软件和硬件的信息传输工具,XML应用于web开发的许多方面,常用于简化数据的存储和共享。

用途:


XML简化数据共享
XML简化数据传输
XML简化平台的变更

 

XML语法

XML处理指令:

XML处理指令,简称PI ( processing instruction ) .处理指令用来指挥解析引|擎如何解析XML文档内容。
< ?xm| version= "1.0" encoding= "utf-8" ?>
-在XML中,所有的处理指令都以<?开始,?>结束。<?后面紧跟的是处理指令的名称。XML 处理指令要求指定一个version属性。并允许指定可选的standalone和encoding ,其中standalone是指是否允许使用外部声明,可设置为yes或no。yes是指定不使用外部声明。no为使用。encoding是指作者使用的字符编码格式。有UTF- 8,GBK,gb2312等等。


元索和属性:

XML文档包含XML元素。XML元素指的是从(且包括)开始标签直到(且包括)结束标签的部分。元素可包含其他元素、文本或者两者
的混合物。元素也可以拥有属性。

XML元素可以在开始标签中包含属性, 属性(Attribute)提供关于元素的额外(附加)信息。属性通常提供不属于数据组成部分的信息,但是对需要处理这个元素的应用程序来说却很重要。XML属性必须加引号, 属性值必须被引号包围,不过单引号和双引号均可使用。如果属性值本身包含双引号,那么有必要使用单引号包围它,或者可以使用实体弓|用。

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
	XML 可扩展标记语言
	
	XML元素(Element):一个元素就是一对标签,格式<name></name>.开始与结束标签名字要一致,
	大小写一致。
 	
 	元素中可以添加属性,属性只能定义在开始标签中,格式为:name="value",多个属性
 	之间用空格隔开。
 	元素中也可以包含子元素或文本(一对标签中可以包含子标签或文本信息)
 	例如:
 	<emp id="1" name="张三">
 		<a>你好</a>
 		<a>谢谢</a>
 		<b>再见</b>
 	</emp>
	
	XML文档有一个要求,只能有一个根元素,根元素就是不被其他元素包含的元素。
	
	XML文档要求元素必须成对定义,但是可以有省略结束标签的写法:
	通常写法:
	<a id="value" ></a>
	省略结束标签的写法:(一般一个元素中不再包含子元素或文本时可以用省略结束标签写法)
	<a id="value" />
	
	当在XML中使用了XML关键字符时,若想表示它原本的含义时要使用实体引用
	<a>1<2</a> 语法错误,认为1<2中的"<"是标签的开始
	
	< : &lt;
	> : &gt;
	' : &apos;
	" : &quot;
	& : &amp;
	
	例如:<a>1<2</a>应当写成<a>1&lt;2</a>
	
 -->
 


大小写敏感:

XML对大小写是敏感的,这点不象HTML。 在XML中标记< Letter>和标记< letter>是不一样的。因此,起始和结束标记的大小写应该写成相同的:

<letter> ... </letter>
< Letter>... </Letter>


元索必须有关闭标签:

XML要求每个元素必须由起始标签和关闭标签组成。关闭标签与起始标签的名字相同,写法上多一个"/"
 

<Letter><!--只有 起始标记是不行的。-->
<Letter> </Letter><!--必须要有关闭标签-->
<Letter /><!--自关闭标签等同于无内容空元素-->


必须有根元素:

XML要求必须有根元素, 所谓根元素就是不被其它元素包围。并且根元素只能有一个。

<datasourceid= "db_ oracle''><!--根元素 -->
    <property name= "url">
        jdbc:thin@192.168.0.26:1 521:tarena
        </property>
            <property name=”dbUser" > openlab </property>
        < property name=”dbPwd" > open123 </property>
    </datasource>
<!--这里不能再定义与datasource平级的元素!-->


元素必须正确嵌套:

XML要求所有元素必须正确的嵌套。

<datasourceid= "db_ oracle" >
<property name=”dbPwd"> open123
</datasource><!--这里嵌套关系出现了错误-->
</property> 


实体引用:

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

实体引用字符说明
&lt;<
 
小于
 
&gt;>
 
大于
&amp;&
 
与字符(和字符)
 

          &apos;


'
 
单引号
&quot; "双引号


 

 

 

 

 

 

 

 

CDATA段:

格式: <! [CDATA [文本内容]] >特殊标签中的实体引|用都被忽略,所有内容被当成一整块文本数据对待

< ?xml version= "1.0" encoding= "utf-8" ?> 
    < root>
        <![CDATA[
               <hello>
                <!-- 无论这里写什么,都会被当做一个文本-->
                <world> 

        ]]>
    < subRoot> </subRoot>
</root>

 

XML解析:

XML解析方式:

SAX解析方式:

SAX ( simple API for XML )是一种XML解析的替代方法。相比于DOM , SAX是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。而且相比于DOM ,SAX可以在解析文档的任意时刻停止解析。
优点:解析可以立即开始,速度快,没有内存压力
缺点:不能对节点做修改


DOM解析方式:

DOM : (Document Object Model,即文档对象模型)是W3C组织推荐的处理XML的一-种方式。DOM解析器在解析XML文档时,会把文档中的所有元素按照其出现的层次关系,解析成一个个Node对象(节 点)。
优点:把xml文件在内存中构造树形结构,可以遍历和修改节点
缺点:如果文件比较大,内存有压力,解析的时间会比较长
 

读取XML:
SAXReader读取XML文档:

使用SAXReader需要导入dom4j fulljar包。dom4j是一个Java的XML API ,类似于jdom ,用来读写XML文件的。dom4j是 个非常优秀的Java XML API具有性能优异、功能强大和易用的特点,同时它也是个开放源代码的软件。创建SAXReader来读取XML文档。

SAXReader reader = new SAXReader();
	
Document doc = reader.read(new File("./emplist.xml"));

Document方法:

Document对象是棵文档树的根 ,可为我们提供对文档数据的最初(或最顶层)的访问入口。Element对象表示XML文档中的元素。
元素可包含属性、其他元素或文本。如果元素含有文本,则在文本节点中表示该文本。

Document的getRootElement方法:

Element getRootElement(用于获取根元素。

Element 方法:


Element element(String name);获取当前元素下的指定名字的子元素
List elements( );获取当前元素下的所有子元素

getName的方法:
String getName( )获取当前元素的元素名


getText方法:

String getText()
获取当前元素的文本节点(起始标记与结束标记之间的文本)

elementText方法是获取当前标签下指定名字子标签中间的文本

attribute方法

-Attribute attribute(int index)
获取当前元素的指定属性, index为索引,从0开始。
Attribute attribute(String name)
获取当前元素的指定名字的属性。

Attribute 方法:

Attribute对象用于描述一个元素中的某个属性信息。
根据该对象可以获取属性名和属性值等信息
- String getName() :获取属性的名字
String getValue() :获取属性的值


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;

/**
 * 解析XML
 * XML解析有两种方式:SAX,DOM
 * SAX:simple api for xml,解析XML的简单API,特点是内存占用少,速度快,但由于是逐行
 * 扫描形式解析,对整体结构没有把控,不能修改XML内容。
 * 
 * DOM:document object model,文档对象模型。特点是解析XML时会将XML结构内建成一颗树
 * 然后通过遍历树的形式解析xml内容,由于对整体结构有把控,可以修改XML内容。但是由于
 * 会内建整棵树,因此内存占用多,速度慢。
 * 
 * W3C推荐的解析形式为DOM
 *
 */
public class ParseXmlDemo {
	public static void main(String[] args) {
		/*
		 * 使用dom解析XML的大致步骤
		 * 1:创建SAXReader
		 * 2:使用SAXReader读取XML文档并生成Document对象(内建树的过程)
		 * 3:通过Document对象获取根元素
		 * 4:通过根元素开始按照XML的结构逐级获取子元素以达到遍历XML的目的
		 */
		try {
			//1
			SAXReader reader = new SAXReader();
			//2
			Document doc = reader.read(new File("./emplist.xml"));
			/*
			 * 3 获取根元素
			 * Element 类的每一个实例用于表示XML文档中的一个元素(一对标签)
			 * 通过Element可以获取其表示的这对标签的相关信息,常用操作有:
			 * 
			 * String getName()
			 * 获取当前标签的名字
			 * 
			 * String getText()
			 * 获取当前标签中间的文本
			 *  
			 * Element element(String name)
			 * 获取当前标签下指定名字的子标签
			 * 
			 * List elements()
			 * 获取当前标签下所有子标签
			 * 
			 * List elements(String name)
			 * 获取当前标签下所有同名子标签(指定的名字)
			 * 
			 */
			//<list>标签
			Element root = doc.getRootElement();
			System.out.println(root.getName());//输出根标签的名字
			/*
			 * 将emplist.xml文件中的所有员工信息读取出来并存入一个集合
			 */
			List<Emp> empList = new ArrayList<>();
			
			//从<list>标签下获取所有<emp>标签
			List<Element> list = root.elements("emp");
			System.out.println(list.size());
			//遍历每一个<emp>标签
			for(Element empEle : list) {
				//获取该员工的名字
				//1先获取<emp>标签下名为<name>的子标签
				Element nameEle = empEle.element("name");
				//2获取<name>标签中间的文本
				String name = nameEle.getTextTrim();				
				//获取年龄
				int age = Integer.parseInt(
//					empEle.element("age").getTextTrim()
					//elementText方法是获取当前标签下指定名字子标签中间的文本
					empEle.elementTextTrim("age")//等同上面一句的代码	
				);
				//获取性别
				String gender = empEle.elementText("gender");
				//获取工资
				int salary = Integer.parseInt(
					empEle.elementText("salary")	
				);
				//获取<emp>标签中的属性id的值
//				Attribute attr = empEle.attribute("id");
//				int id = Integer.parseInt(
//					attr.getValue()	
//				);
				
//				int id = Integer.parseInt(
//					empEle.attribute("id").getValue()
//				);
				//attributeValue方法用来获取当前标签下指定名字的属性对应的值
				int id = Integer.parseInt(
					empEle.attributeValue("id")
				);
				
				Emp emp = new Emp(id, name, age, gender, salary);
				empList.add(emp);
			}
			
			System.out.println("解析完毕");
			for(Emp e : empList) {
				System.out.println(e);
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
}









package xml;
/**
 * 员工类,每一个实例表示xml文档中的一个员工信息
 */
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 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;
	}
	public String toString() {
		return id+","+name+","+age+","+gender+","+salary;
	}
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值