xml解析方式
解析:操作xml文档,将文档中的数据读取到内存中
-
操作xml文档:
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中,持久化的存储
-
解析xml的方式:
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
- 优点:操作方便,可以对文档进行CRUD的所有操作
- 缺点:占内存
- SAX:逐行读取,基于事件驱动的。
- 优点:不占内存。
- 缺点:只能读取,不能增删改
- DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
-
xml常见的解析器:
- JAXP:sun公司提供的解析器,支持dom和sax两种思想
- DOM4J:一款非常优秀的解析器
- Jsoup:jsoup是一款Java的HTML解析器,可以直接解析某个URL地址、HTML文本内容。它提供了一些非常胜利的API,可以通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。
- Pull:Android从阿祖哦系统内置的解析器,sax方式的
-
Jsoup:jsoup是一款Java的HTML解析器,可以直接解析某个URL地址、HTML文本内容。它提供了一些非常胜利的API,可以通过DOM,CSS以及类似于JQuery的操作方法来取出和操作数据。
- 快速入门:
- 步骤:
- 导入jar包
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
- 步骤:
- 快速入门:
package com.ailyt.xml.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
/**
* Jsoup快速入门
*/
public class JsoupStudy1 {
public static void main(String[] args) throws IOException {
//获取Document对象,根据xml文档获取
String path = "src//main//resources//student.xml";
//解析xml文档,加载文档进内存,获取dom树--->Document
Document document = Jsoup.parse(new File(path), "UTF-8");
//获取元素对象 Element
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
//获取第一个name的Element对象
Element element = elements.get(0);
//获取数据
String name = element.text();
System.out.println(name);
}
}
- 对象的使用:
- Jsoup:工具类,可以解析html或xml文档,返回Document
- Parse:解析html或xml文档,返回Document
- parse(File in,String charsetName):解析xml或html文件的
- parse(String html):解析xml或html字符串
- parse(URL url,int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
- Parse:解析html或xml文档,返回Document
- Jsoup:工具类,可以解析html或xml文档,返回Document
package com.ailyt.xml.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class JsoupStudy2 {
public static void main(String[] args) throws IOException {
/* String str = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
"\n" +
"<students>\n" +
" <student number=\"lala_0001\">\n" +
" <name>zhangsan</name>\n" +
" <age>100</age>\n" +
" <sex>female</sex>\n" +
" </student>\n" +
"\n" +
" <student number=\"lala_0002\">\n" +
" <name>李四</name>\n" +
" <age>50</age>\n" +
" <sex>male</sex>\n" +
" </student>\n" +
"\n" +
"</students>";
Document document = Jsoup.parse(str);
System.out.println(document);*/
// parse(URL url,int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
URL url = new URL("https://www.bilibili.com/video/BV1wL411L7A3?p=11");//代表网络中的一个资源路径
Document document = Jsoup.parse(url, 10000);
System.out.println(document);
}
}
- Document:文档对象。代表内存中的demo树
- 获取Element对象
- getElementById(String id):根据id属性获取唯一的element对象
- getElementByTag(String tagName):根据标签名获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementByAttributeValue(String key,String value):根据对应的属性名和属性值获取元素对象集合
- 获取Element对象
package com.ailyt.xml.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class JsoupStudy3 {
public static void main(String[] args) throws IOException {
String path = "src/main/resources/student.xml";
//获取Document对象
Document document = Jsoup.parse(new File(path), "UTF-8");
//获取元素了
//获取所有document对象
Elements elements = document.getElementsByTag("student");
System.out.println(elements);
System.out.println("---------------");
//获取属性名为di的元素对象们
Elements id = document.getElementsByAttribute("id");
System.out.println(id);
//获取number属性值为heima_0001的元素对象
Elements elementsByAttributeValue = document.getElementsByAttributeValue("number", "heima_0001");
System.out.println(elementsByAttributeValue);
//获取id属性值的元素对象
Element itcast = document.getElementById("itcast");
System.out.println(itcast);
}
}
- Elements:元素Element对象的集合。可以动作ArrayList
来使用 - Element:元素对象
-
获取子元素对象
- getElementById(String id):根据id属性获取唯一的element对象
- getElementByTag(String tagName):根据标签名获取元素对象集合
- getElementsByAttribute(String key):根据属性名称获取元素对象集合
- getElementByAttributeValue(String key,String value):根据对应的属性名和属性值获取元素对象集合
-
获取属性值
- String attr(String key):根据属性名称获取属性值
-
获取文本内容
- String text():获取文本内容
- String html():获取标签体的所有内容(包括标签的字符串内容)
-
package com.ailyt.xml.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
public class JsoupStudy4 {
public static void main(String[] args) throws IOException {
String path = "src/main/resources/student.xml";
//获取Document对象
Document document = Jsoup.parse(new File(path), "UTF-8");
//通过Document对象获取name标签,获取所有的name标签,可以获取到两个
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
System.out.println("---------------------");
//通过Element对象获取子标签对象
Element element_student = document.getElementsByTag("student").get(0);
Elements element_name = element_student.getElementsByTag("name");
System.out.println(element_name);
//通过student对象的属性值
String number = element_student.attr("NUMBER");
System.out.println(number);
//获取文本内容
String text = element_name.text();
String html = element_name.html();
System.out.println(text);
System.out.println(html);
}
}
-
Node:节点对象
- Document和Element的父类
-
快速查询方式:
- selector:选择器
- 使用的方法:Elements select(String cssQuery)
- 语法:参考Selector类中定义的语法
- 使用的方法:Elements select(String cssQuery)
- selector:选择器
package com.ailyt.xml.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
public class JsoupStudy5 {
public static void main(String[] args) throws IOException {
String path = "src/main/resources/student.xml";
//获取Document对象
Document document = Jsoup.parse(new File(path), "UTF-8");
//查询name标签
/**
* div{
*
* }
*/
Elements elements = document.select("name");
System.out.println(elements);
System.out.println("--------------");
//查询id值为itcast的元素
Elements elements1 = document.select("#itcast");
System.out.println(elements1);
//获取student标签并且number属性值为heima_0001的age子标签
//获取student标签并且number属性值为heima_0001
Elements elements2 = document.select("student[number=\"heima_0001\"]");
System.out.println(elements2);
}
}
- XPath:XPath即为XML路径语言,它是一种用来确认XML(标准通用标记语言的子集)文档中某部分位置的语言
- 使用Jsoup的Xpath需要额外导入jar包。
package com.ailyt.xml.jsoup;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class JsoupStudy6 {
public static void main(String[] args) throws IOException {
String path = "src/main/resources/student.xml";
//获取Document对象
Document document = Jsoup.parse(new File(path), "UTF-8");
//根据document对象,创建JXDocument对象
JXDocument jxDocument = new JXDocument(document);
//结合xpath语法查询
List<JXNode> jxNodes = jxDocument.selN("//student");
jxNodes.forEach(jxNode -> {
System.out.println(jxNode);
});
System.out.println("-----------------------------------------------------------");
//查询所有的student标签下的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
jxNodes2.forEach(jxNode -> {
System.out.println(jxNode);
});
}
}