文章目录
了解XML(可扩展标记语言)
XML(EXtensible Markup Language) 是 W3C 的推荐标准(结构标准语言),XML最初设计的目的是弥补HTML的不足,以强大的扩展性满足网络信息发布的需要,后来逐渐用于网络数据的转换和描述。XML 被设计为传输和存储数据,其焦点是数据的内容(当然安卓开发是用来做界面布局的)。HTML 被设计用来显示数据,其焦点是数据的外观。
XML的作用(简要)
- 可以用来保存数据
如安卓中的数据存储使用SharedPreferences专门存储一些单一的小数据,数据就是以xml保存的
 - 可以用来做配置文件
这个是最为普遍的,如Tomcat中conf的web.xml与server.xml - 数据传输载体
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的基本用法
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的时候,能够快速的定位到具体的某一个元素。
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 教程

京公网安备 11010502036488号