文章目录
了解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 教程