1.xml简介
1.1 什么是xml?
xml是可扩展的标记语言。
1.2 xml有什么作用?
xml主要的作用:
1、用来保存数据,而且这些数据具有自我描述性。
2、它还可以作为项目或者模块的配置文件。
3、还可以作为网络传输的格式。(现在JSON为主)
1.3 xml语法
1.文档声明
2.元素(标签)
3.xml属性
4.xml注释
5.文本区域(CDATA区)
1.4 文档声明
我们先创建一个简答的xml文件,用来描述图书信息。
1)创建一个xml文件,src–>other–>file–>books.xml
<?xml version="1.0" encoding="UTF-8"?>
<!--
这是xml的注释,
xml声明
version 版本号
encoding xml的文件编码
standalone="yes/no" 表示这个xml文件是否独立的xml
而且 <?xml 要连在一起写,否则会报错
-->
<books>
<book id="book1"><!-- book1 标签描述一本图书,id属性描述的是图书的编号 -->
<name>java编程思想</name> <!-- name标签描述的是图书的名称 -->
<author>詹姆斯搞死你</author><!-- author意思是作者, 描述图书的作者 -->
<pirce>99.9</pirce><!-- price单词的意思是单价,描述图书的价格 -->
</book>
<book id="book2"><!-- book1 标签描述一本图书,id属性描述的是图书的编号 -->
<name>java从入门到放弃</name> <!-- name标签描述的是图书的名称 -->
<author>健哥</author><!-- author意思是作者, 描述图书的作者 -->
<pirce>58.9</pirce><!-- price单词的意思是单价,描述图书的价格 -->
</book>
</books>
1.4.1 注释
html和xml注释的是一样:
1.4.2 元素(标签)
html标签:
格式:<标签名>数据</标签名>
单标签:<标签名/>
双标签:<标签名>数据</标签名>
标签名大小写不敏感
标签有属性,有基本属性和事件属性
标签要闭合(不关闭,html中不报错,但是我们要养成良好的书写习惯,闭合)
1)什么是xml元素
xml元素是指的从开始标签直到结束标签的部分。
元素可包含其他元素,文本或者两者的混合物,元素也可以拥有属性。
元素我们可以简单的理解为标签,Element翻译元素。
2)xml命名规则
xml元素必须遵守以上命名规则:
2.1名称可以包含字母、数字以及其他的字符
2.2名称不能为数字或者标点符开始
2.3名称不能为字符"xml"或者xml,XML开始
2.4名称不能包含空格
3)xml中的元素(标签)也可以分成单标签和双标签
![](img/1.png)
1.4.3 xml属性
xml的标签属性和html标签属性是非常类似的,属性可以提供元素的额外信息,
在标签上可以书写属性:
一个标签可以书写多个属性,每个属性的值必须使用引号引起来。
xml属性必须加引号,属性值必须被引号包围,不过单引号和双引号都可以使用。
1.4.4 语法规则
所有xml元素都必须有闭合标签
xml标签对大小写敏感
xml必须正确嵌套
xml文档必须有根元素
- 根元素就是顶级元素
- 没有父标签的元素,叫顶级元素
- 根元素是没有父标签的顶级元素,而且是唯一一个才行。
1.4.5 xml中特殊字符
![](img/2.png)
1.4.6 文本区域(CDATA区)
CDATA语法可以告诉xml解析器,CDATA里的文本内容,只是纯文本,不需要xml语法解析。
<book id="book2"><!-- book1 标签描述一本图书,id属性描述的是图书的编号 -->
<name>java从入门到放弃</name> <!-- name标签描述的是图书的名称 -->
<author> <!-- author意思是作者, 描述图书的作者 -->
<![CDATA[
<<<<<<<<<<<<<<<刘德华>>>>>>>>>>>>>>>>>>
]]>
</author>
<pirce>58.9</pirce><!-- price单词的意思是单价,描述图书的价格 -->
</book>
CDATA文本区,里面的内容不会被解析,只会把他们当做纯文本。
2.xml解析技术介绍
xml可扩展的标记语言,不管是html还是xml文件他们都是标记性文档,都可以使用W3C组织指定的dom技术来解析。
dom将xml文档作为一个树形结构,而树叶被定义为节点。
早期JDK为我们提供了两种XML解析技术DOM和SAX简介。
dom解析技术是由w3c组织制定的,而所有的编程语言对这个解析技术使用了自己语言的特点进行实现,java对dom技术解析标记也做了实现。
sun公司在JDK5版本对dom解析技术进行了升级sax。
sax解析,他跟w3c制定的解析不太一样,它是一行一行的读取xml文件进行解析的,不会创建大量的dom对象,所在它在解析xml的时候,在内存的使用上和性能上,都优于dom解析。
解析XML的方式
1.DOM:将标记语言一次性加载进内存,在内存中形成一颗dom树。
优点:操作方便,可以对文档进行CRUD的所有操作。
缺点:占内存。
2.SAX:逐行读取,基于事件驱动。
优点:不占内存。
缺点:只能读取,不能增删改。
xml常见解析器
1.JAXP:sun公司提供的解析器,支持dom和sax两种思想。
2.DOM4J:一款非常优秀的解析器。
- jdom在dom基础上进行了封装。
- dom4j:有对jdom进行了封装。
3.JSOUP:JSOUP是一款java的HTML解析器,可以直接解析某个url地址,HTML文本内容,它提供了一套非常省事的API,可以通过DOM,CSS以及类似于jquery的操作方式来取出和操作数据。
4.PULL:android操作系统内置的解析器,SAX方式。
3.DOM4J的解析技术
由于dom4j它不是sun公司的拘束,属性第三方公司的技术,我们需要使用dom4j,就需要dom4j官网下载dom4j的jar包。
3.1 dom4j编程步骤
1.先加载xml文件创建document对象
2.通过document对象拿到根元素对象
3.通过根元素.elements(标签名),可以返回一个集合,这个集合里面放着,所有你指定的标签名的元素对象
4.找到你想要修改,删除的资源上,进行相应的操作。
3.2 获取document对象
创建一个lib目录,添加dom4j的jar包,并添加到类路径。
public class Dom4jTest {
/**
* dom4j获取document对象
*
* @param args
* @throws DocumentException
*/
public static void main(String[] args) throws DocumentException {
// 要创建一个document对象,需要我们先创建一个SaxReader对象
SAXReader reader = new SAXReader();
// reader对象用于读取xml文件,然后返回一个document
Document document = reader.read("src/books.xml");
}
}
3.3 获取所有标签中的内容
1.通过创建SaxReader对象,来读取xml文件,获取document对象。
2.通过document对象,拿到xml的根元素对象。
3.通过根元素对象,获取所有的book标签对象。
4.遍历每个book标签对象,然后获取book标签对象内的每一个元素,通过getText()方法来拿到起始标签和结束标签之间的文本内容。
package com.hckj.test;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
public class Dom4jTest {
/**
* dom4j获取document对象
*
* 1.通过创建SaxReader对象,来读取xml文件,获取document对象。 2.通过document对象,拿到xml的根元素对象。
* 3.通过根元素对象,获取所有的book标签对象。
* 4.遍历每个book标签对象,然后获取book标签对象内的每一个元素,通过getText()方法来拿到起始标签和结束标签之间的文本内容。
*/
public static void main(String[] args) throws DocumentException {
// 要创建一个document对象,需要我们先创建一个SaxReader对象
SAXReader reader = new SAXReader();
// reader对象用于读取xml文件,然后返回一个document
Document document = reader.read("src/books.xml");
// 通过document对象,拿到xml的根元素对象
Element root = document.getRootElement();
// root.asXML() 将当前元素对象转成String 对象
// System.out.println(root.asXML());
// 通过根元素对象,获取所有的book标签对象
// root.elements(标签名) 它可以拿到当前元素下的指定的子元素的集合
List<Element> books = root.elements("book");
// 遍历每个book标签对象,然后获取book标签对象内的每一个元素
for (Element book : books) {
// // 拿到books下面的元素对象
// System.out.println(book.asXML());
// attributeValue 获取已知属性名
String id = book.attributeValue("id");
Element nameElement = book.element("name");
Element authorElement = book.element("author");
Element priceElement = book.element("price");
// // 通过getText()方法来拿到起始标签和结束标签之间的文本内容
System.out.println("id:" + id + "\t书名:" + nameElement.getText() + "\t作者:" + authorElement.getText()
+ "\t单价:" + priceElement.getText());
}
}
}
4.JSOUP
1.导入jar包
2.获取document对象
3.获取对应的标签Element对象
4.获取数据
public static void main(String[] args) throws Exception {
// 获取student.xml的path
// 原来是路径名中出现了空格,在编译的时候,编译器会将空格编译成%20,从而在Jsoup.parse(new
// File(path))的方法中,无法得到正确的路径,从而出现找不到不路径,或者空指针异常。
// path中的getPath方法前加上toURI方法,从而将空格重新转换回来,
String path = JsoupTest.class.getClassLoader().getResource("student.xml").toURI().getPath();
// 解析xml文档,加载文档进内存,获取dom树
// parse 解析xml或html文件
Document document = Jsoup.parse(new File(path), "utf-8");
// 获取元素对象
// getElementById 根据id属性获取唯一的element对象
// getElementsByTag 根据标签名称获取元素对象集合
Elements elments = document.getElementsByTag("name");
// 获取第一个name的element对象
Element element = elments.get(0);
String name = element.text();
System.out.println(name);
}
快速查询的方式
1.selector:选择器
select语法:参考selector类中定义的语法
2.Xpath:Xpath即xml路径语言,它是一种用来确定xml文档中某部分位置的语言
使用jsoup的Xpath需要导入额外的包。
查看w3cshool参考手册,使用xpath的语法来完成查询。
public class JsoupTest2 {
public static void main(String[] args) throws Exception {
String path = JsoupTest2.class.getClassLoader().getResource("student.xml").toURI().getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
// 根据document对象创建 jxDocument
JXDocument jxDocument = new JXDocument(document);
// 查询所有的student标签
// 全文搜索路径 : 全文搜索路径是以“//”开头, 在整个文档中查找符合规则的节点,不需要管目录的结构
// List<JXNode> jxNodes = jxDocument.selN("//student");
// for (JXNode node : jxNodes) {
// System.out.println(node);
// }
// 查询所有student标签下的name标签
// List<JXNode> selN = jxDocument.selN("//student/name");
// for (JXNode node : selN) {
// System.out.println(node);
// }
// 查询所有student标签下带有id属性的name标签
// 如果需要查找的是属性值:那么必须以@开头
// List<JXNode> selN = jxDocument.selN("//student/name[@id]");
// for (JXNode node : selN) {
// System.out.println(node);
// }
// 查询student标签下带有id属性的name标签,并且id属性为hckj
List<JXNode> selN = jxDocument.selN("//student/name[@id='hckj']");
for (JXNode node : selN) {
System.out.println(node);
}
}