了解XML(可扩展标记语言)

XML(EXtensible Markup Language) 是 W3C 的推荐标准(结构标准语言),XML最初设计的目的是弥补HTML的不足,以强大的扩展性满足网络信息发布的需要,后来逐渐用于网络数据的转换和描述。XML 被设计为传输和存储数据,其焦点是数据的内容(当然安卓开发是用来做界面布局的)。HTML 被设计用来显示数据,其焦点是数据的外观。

XML的作用(简要)

  1. 可以用来保存数据
    如安卓中的数据存储使用SharedPreferences专门存储一些单一的小数据,数据就是以xml保存的
  2. 可以用来做配置文件
    这个是最为普遍的,如Tomcat中conf的web.xml与server.xml
  3. 数据传输载体
    xml是一种数据交换格式,但是xml解析数据较复杂,现在客户端与服务器数据交换格式一般使用JSON

XML 语法

1.定义xml

xml其实就是一个文件,我们只要建一个文本按一定的语法编写后,把文件的后缀为 .xml即可。

2.文档声明
	<?xml version="1.0" encoding="gbk" standalone="no" ?>

	version:解析这个xml的时候,使用那个版本的解析器解析
	encoding:解析xml中的文字的时候,使用什么编码来解析
	standalone:no——该文档会依赖关联其他文档   yes——这是一个独立的文档  

关于encoding:
1.如果文件是以GBK的编码保存的,那么要是xml正常显示,则encoding应该是GBK或gb2312。(以什么编码方式保存,则encoding就是什么编码方式)

GB2312编码适用于汉字处理、汉字通信等系统之间的信息交换。GBK与GB 2312—1980国家标准所对应的内码标准兼容。对于人名、古汉语等方面出现的罕用字,GB 2312不能处理,这导致了后来GBK及GB 18030汉字字符集的出现。这里可以看出gbk是对gb2132的扩展,但是一些对于一些罕见字,如果使用gbk编码保存,以gb2312来解码,可能会出现乱码

2.通常PC端保存文件时见到的ANSI其实就是本地编码GBK;

3.一般为了通用性建议使用UTF-8编码保存,即encoding也应为UTF-8.

3.XML元素(标签)

1.<> 括起来的都叫元素,且是成对出现的,可以称为开始标签和结束标签。

<person> </person>

2.文档声明下来的第一个元素叫做根元素 (根标签)
3.属性的定义:XML元素可以在开始标签中包含属性

 <元素名称 属性名称="属性的值"></元素名称>   <person name=“张三” age=“18”> </person>

4.关于空标签:空标签“<”标识开始,以“/>”标识结束,一般配合属性来用。
语法格式:

 <空标签的名称 属性列表/>     如: <person name=“张三” age=“18”/>

 <空标签的名称/>    如: <person/>

5.元素里面可以嵌套其他的元素,元素里面也可以是普通的文字

<person>
	<student id="1">
		<name>张三</name>
	</student>
	
	<student id="2">
		<name>王五</name>
	</student>
</person>

6.标签可以自定义。

更多规则可参考:
XML 教程


XML 解析

获取元素里面的字符数据或属性数据。

1.解析方式

解析方式有很多种,常用的有两种。
1.DOM:文档对象模型(Document Obiect Model),官方推荐

dom原理:把整个xml全部加载到内存中,形成树状结构。整个文档对应Document对象,属性对应Attribute对象,所有元素节点对应Element对象,文本对应Text对象,而以上所有对象都可称为Node对象
优点:可以对文档进行增删改查操作
缺点:当xml很大时,由于是把整个文档加载到内存,将会造成内存溢出。

DOM解析时XML文档形成所树结构的理解

<?xml version="1.0" encoding="UTF-8"?>
<person sex="男">
	<name>李华</name>
	<age>18</age>
</person>


2.SAX:简单应用程序接口(Simple Api For Xml)

特点:基于事件驱动,读取一行,解析一行。
优点:不会造成内存溢出
缺点:不能进行增删改,只能查询

2.针对这两种解析方式的API

DOM与SAX是一种解析思想,并没有提供相应的api实现,一些组织或者公司, 针对这两种解析方式, 给出了一些解决方案。
如:

dom4j:是一个易用的、开源的库,用于 XML,XPath 和 XSLT。它应用于 Java 平 台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。使用广泛
jdom
jaxp :sun公司提供的,使用比较繁琐
Jsoup:

dom4j的基本用法

dom4j下载地址

1.导包

2.创建xml

<?xml version="1.0" encoding="UTF-8"?>
<students>
	<student>
	<name>李华</name>
	<age>18</age>
	</student>
	
	<student>
	<name>小明</name>
	<age>28</age>
	</student>
</students>

2.测试基本用法

package xmlparser;
import java.io.File;
import java.util.List;

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

public class XmlParser {
	public static void main(String[] args){
		try {
			//1.创建sax读取对象
			SAXReader reader=new SAXReader();
			//2.指定解析的xml源,得到的 Document 对象就带表了整个 XML
			Document  document  = reader.read(new File("src/xml/student.xml"));
			//3.得到元素
				//得到根元素
			Element rootElement = document.getRootElement();
			
				//获取根元素下的子元素 name
			String name1 = rootElement.element("student").element("name").getText();
			System.out.println(name1);
			
			
// Element element = rootElement.element("student");
// System.out.println(element);//org.dom4j.tree.DefaultElement@31befd9f [Element: <student attributes: []/>]
			
			
				//获取根元素下的所有子元素 student
			List<Element> elements = rootElement.elements();
			//遍历所有student元素
			for(Element elementBianli:elements){
				//得到student元素下的name元素
				String name2 = elementBianli.element("name").getText();
				String age = elementBianli.element("age").getText();
				System.out.println(name2+" "+age);
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}

运行结果:

Dom4j 的 Xpath使用

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

DOM4j 对 XPath 有良好的支持,如访问一个节点,可直接用 XPath 选择,支持我们在解析xml的时候,能够快速的定位到具体的某一个元素。

jaxen下载地址

1.导包

2.测试基本使用:

package xmlparser;

import java.io.File;
import java.util.List;
import org.dom4j.DocumentException;

public class XmlParserXpath {
	
	public static void main(String[] args){
		try {
			//1.创建sax读取对象
			org.dom4j.io.SAXReader reader=new org.dom4j.io.SAXReader();
			//2.指定解析的xml源
			org.dom4j.Document  document  = reader.read(new File("src/xml/student.xml"));
			//3.得到元素
				//得到根元素
			org.dom4j.Element rootElement = document.getRootElement();
			
				//返回一个元素,获取的是第一个name
			org.dom4j.Element nameElement = (org.dom4j.Element) rootElement.selectSingleNode("//name");
			System.out.println(nameElement.getText());
			
			System.out.println("===================");
			
			//获取文档里面的所有name元素 
			List<org.dom4j.Element> selectNodes = rootElement.selectNodes("//name");
			for(org.dom4j.Element nameElementBianli:selectNodes){
				System.out.println(nameElementBianli.getText());
			}
		} catch (DocumentException e) {
			e.printStackTrace();
		}
	}
}

运行结果:

一般的使用,在查找指定节点的时候,根据XPath语法规则来查找,更多XPath语法规则可参考:
XPath 教程