xml—xml的解析
操作xml文档
- 解析(读取):将文档中的数据读取到内存中
- 写入:将内存中的数据保存到xml文档中。持久化的存储
解析xml的方式
-
DOM:将标记语言一次性加载进内存,在内存中形成一个domshu
优点:操作方便,可以对文档进行CRUD的所有操作
缺点:dom树占内存
-
SAX:逐行读取(读一行释放一行),基于事件驱动的
优点:不占内存
缺点:只能读取。不能增删改
xml常见的解析器
- JAXP:sun公司提供的解析器,支持dom和sax两种思想(了解)
- DOM4J:一款非常优秀的解析器(dom思想)
- Jsoup:html解析器,也可以解析xml(dom思想)
- PULL:Android操作系统内置的解析器,sax方式
Jsoup解析器:
-
使用步骤:
- 导入jar包https://pan.baidu.com/s/1cFqxLwusz6toeLfCtu6jKQ
提取码:b5zu - 获取Document对象
- 获取对象的标签Element对象
- 获取数据
mport 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 JsoupDemo1 { public static void main(String[] args) throws IOException { //1.获取Document对象 根据xml文档获取 //1.1获取student.xml的path String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath(); //1.2解析xml文档 加载文档进内存 获取dom树,字符集要和xml文档的字符集一致 Document document = Jsoup.parse(new File(path), "utf-8"); //2.获取元素对象Element,根据标签名字获取,Elements是ArrayList的子类,可以当作集合来处理 Elements elements = document.getElementsByTag("name"); for (Element element : elements) { //text方法获取数据 System.out.println(element.text()); } } }
- 导入jar包https://pan.baidu.com/s/1cFqxLwusz6toeLfCtu6jKQ
对象的使用
-
Jsoup:工具类,可以解析html和xml文档,返回Document
-
parse:解析html或xml文档,返回Document
- parse(File in,String charsetName):解析html或xml文件的
- parse(String html):解析xml或html字符串
- parse(URL url,int timeoutMillis):通过网络路径获取指定的html或xml的文档对象
import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import java.net.URL; public class Demo2 { public static void main(String[] args) throws Exception { URL url = new URL("https://mp.csdn.net/postlist/list/all?undefined=all&keyword=%E5%8D%95%E4%BE%8B"); //url 、超时时间 Document document = Jsoup.parse(url, 10000); System.out.println(document); } }
-
-
Document :文档对象,代表内存中的dom树
- 获取Element对象
- getElementsByTag(Stirng tagName):根据标签名称获取元素对象集合
- getElementsByAttribute(String key):根据属性名获取元素对象集合
- getElementsByAttributeValue(String key,String value):根据属性名和属性值来获取元素对象集合
- getElementById(String id):根据id属性值获取元素对象
- 获取Element对象
-
Elements:元素Element对象的集合,可以当作ArrayList使用
-
Element:元素对象
-
获取子元素对象
- getElementsByTag(Stirng tagName):根据标签名称获取元素对象集合
- getElementsByAttribute(String key):根据属性名获取元素对象集合
- getElementsByAttributeValue(String key,String value):根据属性名和属性值来获取元素对象集合
- getElementById(String id):根据id属性值获取元素对象
-
获取属性值
String attr(String key):根据属性名称获取属性值
-
获取文本内容
String text():获取文本内容(包括子标签纯文本内容)
String html():获取标签体的所有内容(包括子标签的内容)
-
-
Node:节点对象;是Document和Element的父类
快捷查找数据的方式
-
selector:选择器
查找API链接:
https://pan.baidu.com/s/1QoAydebIpDaTnqcY6c6Dfg
提取码:pknj-
使用的方法: Elements select(String cssQuery)
- 语法:API
mport org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import java.io.File; //选择器查询 public class Demo5 { public static void main(String[] args) throws Exception{ String path = Demo5.class.getClassLoader().getResource("student.xml").getPath(); Document document = Jsoup.parse(new File(path), "utf-8"); //Document继承Elements,所以可以使用Document查询 //查询name标签 Elements name = document.select("name"); System.out.println(name); System.out.println("---------------"); //查询id值为itcast_0001的元素 Elements select = document.select("#itcast_0001"); System.out.println(select); //获取student标签并且number值是itcast_0002的age标签 System.out.println("-----------------"); Elements select1 = document.select("student[number='itcast_0002'] > age"); System.out.println(select1); } }
-
-
XPath: 是xml路径语言,他是一种用来确定xml文档中某部分位置的语言(语法参考w3cschool)
使用Jsoup的Xpath需要额外导入jar包
https://pan.baidu.com/s/152s9rBzO35EFpveB9ajUrQ
提取码:2ya5
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.util.List;
public class Demo6 {
public static void main(String[] args) throws Exception{
String path = Demo6.class.getClassLoader().getResource("student.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
//根据document对象 创建JXDocument对象
JXDocument jxDocument = new JXDocument(document);
//结合xpath语法查询,语法查找于w3cschool,元素所有的student标签
List<JXNode> jxNodes = jxDocument.selN("//student");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}
System.out.println("--------------------------------");
//查询所有student标签下的name标签
List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes1) {
System.out.println(jxNode);
}
System.out.println("---------------");
//查询student标签下带有id的name的标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
System.out.println("=================================");
//查询student标签下带有id的name的标签,并且id属性值为1
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='1']");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
}
}