XML
1. 概念:
- Extensible Markup Language,可扩展标记语言。可扩展的意思主要是指,在这种标记语言中,标签是可以自定义的,如定义一个people标签< people >,定义一个emp标签 < emp >
2. 功能
- 主要用于存储数据,替代properties格式的配置文件,便于在网络中传输等。
3. xml与HTML的区别
- xml的语法是严格的,HTML的语法是松散的
- xml的标签都是自定义的,HTML的标签都是预定义的
- xml主要使用来存储数据的,HTML主要是展示数据的
4. 基本语法
-
xml文档的后缀名为xml
-
xml文档第一行必须是文档声明,如
< ?xml version='1.0' ? >
-
xml文档有且仅有一个根标签
-
属性值必须使用引号引起来
-
标签必须正确关闭
-
xml文档标签名大小写敏感的
<?xml version="1.0"?> <users> <user> <name>aaa</name> <age>12</age> <gender>male</gender> </user> <user> <name>bbb</name> <age>12</age> <gender>male</gender> </user> <user> <name>ccc</name> <age>12</age> <gender>female</gender> </user> </users>
5.组成部分
- 文档声明:
- 格式:< ?xml 属性列表? >
- 属性列表:
- version:版本号,这是必须的属性
- encoding:编码方法
- standalone:是否独立,取值为yes或者no,是否依赖其他文件
- 指令:用来结合css展示数据,现在一般不使用
- 标签:
- 名称可以包含字母、数字、其他字符
- 名称不可以以数字、标点符号开头
- 名称不可以xml开头
- 名称不能包含空格
- 属性:id值唯一
- 文本:
- CDATA区的数据会被原样展示:< ![CDATA[ 数据 ]] >
- 文档声明:
6.xml的解析
操作xml文档,将文档的数据读取到内存中
-
解析xml的方法:
- DOM方法:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树,一般用在服务器端
- 优点:操作方便,可以对文档进行CRUD的所有操作
- 缺点:DOM树加载进内存,更加占用内存
- SAX方法:逐行读取,逐行释放,基于事件驱动
- 优点:每次读取一行,不占用内存,适合内存小的设备
- 缺点:只能进行读取,不能增删改
- DOM方法:将标记语言文档一次性加载进内存,在内存中形成一颗DOM树,一般用在服务器端
-
XML常见的解析器:
- JAXP:SUN公司提供的解析器,支持dom、sax两种方法
- DOM4J:一款优秀的解析器
- Jsoup:一款Java的HTML解析器,可以直接解析某个URL地址,HTML文本内容
- PULL:Android操作系统内置的解析器,sax方法的
-
Jsoup
使用步骤:
-
导入jar包
-
获取document对象
-
获取对应的标签,其实就是Element对象
public class JsoupDemo01 { public static void main(String[] args) throws IOException { // 通过类加载器,获得xml文件的路径 String path = JsoupDemo01.class.getClassLoader().getResource("users.xml").getPath(); // 获取document对象,也就是DOM树加载进内存 Document document= Jsoup.parse(new File(path), "utf-8"); // 获取元素对象,返回的Elements是ArrayList的子类 Elements elements = document.getElementsByTag("name"); System.out.println(elements.size()); Element element = elements.get(0); System.out.println(element.text()); } }
-
4.Jsoup的对象:
-
Jsoup:工具类,可以解析HTML 或者xml文档,返回Document,主要是parse方法,有多个重载形式
- parse(File in, String charSetName):解析xml或者HTML文件的
- parse(String html):用来解析xml或者HTML字符串
- parse(URL url, int timeoutMillis):通过网络路径获取指定的HTML或者xml文档对象
URL url = new URL("https://www.zhihu.com/question/27574436"); Document document1 = Jsoup.parse(url, 10000);// 解析某个HTML System.out.println(document1);
-
Document对象:文档对象,代表着内存中的dom树
- 获取element对象
- getElementsByTag(String name):根据标签名获取元素集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key, String value):根据对象的属性名,属性值获取元素对象集合
- 获取element对象
-
Elements:元素Element对象的集合,可以当做ArrayList< Element >使用
-
Element对象:元素对象
- 获取子元素对象(子元素也是element对象):
- getElementsByTag(String name):根据标签名获取元素集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementsByAttributeValue(String key, String value):根据对象的属性名,属性值获取元素对象集合
- 获取属性值
- String attr(String key):根据属性名获取属性值
- 获取文本内容:
- String text ():获取所有子标签的纯文本内容
- String html():获取标签体的所有内容,包括子标签的标签和文本内容
- 获取子元素对象(子元素也是element对象):
-
Node:节点对象,是Document和Element的父类
7.Jsoup的两种快捷查询方式
-
selector:选择器
- 方法:Elements select(String cssQuery);
// 获取user标签,并且id=001的子标签age标签 Elements el = document.select("user[id="001"] > age"); System.out.println(el); // 获取id值为001的元素 Elements select = document.select("#001"); System.out.println(select);
-
Xpath:xml路径语言,用来确定xml
- 需要导入jar包
具体语法要去查看Xpath文档,简单的几个
- // 标签名:查找所有标签
- / 标签名:子标签
- [ @id ] : 带有id属性的标签
// 获取所有的user标签 JXDocument jxDocument = new JXDocument(document); List<JXNode> jxNodes = jxDocument.selN("//user"); for (JXNode jxNode : jxNodes) { System.out.println(jxNode); } // 获取所有user标签下的age标签 System.out.println("============================"); List<JXNode> jxNodes1 = jxDocument.selN("//user/age"); for (JXNode jxNode : jxNodes1) { System.out.println(jxNode); } System.out.println("==============================="); // 获取带有id属性的user标签 List<JXNode> jxNodes2 = jxDocument.selN("//user[@id]"); for (JXNode jxNode : jxNodes2) { System.out.println(jxNode); } System.out.println("==============================="); // 获取带有id属性,且属性值是001,的user标签 List<JXNode> jxNodes3 = jxDocument.selN("//user[@id='001']"); for (JXNode jxNode : jxNodes3) { System.out.println(jxNode); }