XML解析之Jsoup
操作xml文件
- 解析(读取):将文档中的数据解读到内存中
- 写入:将内存中的数据保存到XML文档中。持久化的存储
解析xml的方式
DOM:将标记语言文档一次性加载进内存,在内存中形成一颗dom树
优点:
操作方便,可以对文档进行CRUD(增删改查)的所有操作
缺点:
占内存
SAX:逐行读取,基于事件驱动
优点
不占内存
缺点
只能读取
常用的解析器:
- JAXP:sum公司提供的解析器,支持dom和sax两种思想
- DOM4J:优秀的解析器
- Jsoup:一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
- PULL:android系统内置解析器
Jsoup
快速入门
从URL,文件或字符串中刮取并解析HTML
查找和提取数据,使用DOM遍历或CSS选择器
操纵HTML元素,属性和文本
根据安全的白名单清理用户提交的内容,以防止XSS攻击
输出整洁的HTML
步骤:
- 导入jar包
- 获取Document对象
- 获取对应的标签Element对象
- 获取数据
代码:
xml文件:
<?xml version="1.0" encoding="UTF-8" ?>
<students>
<student number="heima_0001">
<name id="cat">tom</name>
<age>18</age>
<sex>male</sex>
</student>
<student number="heima_0002">
<name>jack</name>
<age>12</age>
<sex>male</sex>
</student>
</students>
测试代码:
public class JsoupTest {
public static void main(String[] args) throws IOException {
//获得路径path
String path = JsoupTest.class.getClassLoader().getResource("student.xml").getPath();
//解析
Document document = Jsoup.parse(new File(path), "utf-8");
//获取元素
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
//获取数据
for (int i = 0; i < elements.size(); i++) {
System.out.println(elements.get(i).text());
}
}
}
对象的使用
Jsoup:工具类,可以解析html或xml文档,返回Document
parse方法
解析xml或html对象
public static Document parse(File in,String charsetName)throws IOException
Parse the contents of a file as HTML. The location of the file is used as the base URI to qualify relative URLs.
解析xml或html字符串
public static Document parse(String html)
Parse HTML into a Document. As no base URI is specified, absolute URL detection relies on the HTML including a
<base href>tag.通过网络路径获取指定的html或xml的文档对象
public static Document parse(URL url,int timeoutMillis)throws IOException
Fetch a URL, and parse it as HTML. Provided for compatibility; in most cases use [
connect(String)](file:///C:/Users/ada/AppData/Local/Temp/360zip$Temp/360$3/day32_xml/03_参考/jsoup/jsoup-1.11.2-javadoc/org/jsoup/Jsoup.html#connect-java.lang.String-)The encoding character set is determined by the content-type header or http-equiv meta tag, or falls back to
UTF-8.等;
Document :文档对象。代表内存中的dom树
获取Element对象
- 根据标签名获取对象集合
public Elements getElementsByTag(String tagName)
Finds elements, including and recursively under this element, with the specified tag name.
- 根据属性名称获取对象集合
public Elements getElementsByAttribute(String key)
Find elements that have a named attribute set. Case insensitive.
- 根据对应的属性名和值获取元素对象集合
public Elements getElementsByAttributeValue(String key, String value)
Find elements that have an attribute with the specific value. Case insensitive.
- 根据ID属性获取唯一的element
public Element lastElementSibling()
Gets the last element sibling of this element
Elements :Element对象的集合。可以当作ArrayList来使用
Element :元素对象
- 获取子元素对象
- 获取属性值
- String attr(String key):根据属性名称获取属性值
- 获取文本内容
- String text():获取文本内容
- String html();获取标签体的所有内容
Node :节点对象
- Document和Element的父类
快速查询方式
selector:选择器
使用的方法:Elements select(String cssQuery)
样例:
public class JsoupTest {
public static void main(String[] args) throws IOException {
//获得路径path
String path = JsoupTest.class.getClassLoader().getResource("student.xml").getPath();
//解析
Document document = Jsoup.parse(new File(path), "utf-8");
//查询name标签
Elements elements = document.select("name");
System.out.println(elements.get(0).text());
//查询id
Elements id = document.select("#cat");
System.out.println(elements.get(0).select("name").text());
System.out.println("******************");
//查找student中number等于heima_0001
Elements select = document.select("student[number=\"heima_0001\"]");
System.out.println(select);
System.out.println("******************");
//查找student中number等于heima_0001中的age子标签
Elements select1 = document.select("student[number=\"heima_0001\"]>age");
System.out.println(select1);
}
}
XPath:
解释:
XPath 是一门在 XML 文档中查找信息的语言。
XPath 是 XSLT 中的主要元素。
XQuery 和 XPointer 均构建于 XPath 表达式之上
使用Jsoup的xpath需要额外导入jar包
查询w3cschool参考手册,使用xpath语法完成
public class JsoupXpath {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
//获得路径path
String path = JsoupTest.class.getClassLoader().getResource("student.xml").getPath();
//解析
Document document = Jsoup.parse(new File(path), "utf-8");
//剧创建JXDocumnet对象
JXDocument jxDocument=new JXDocument(document);
//结合xpath语法查询
List<JXNode> jxNodes = jxDocument.selN("//student");
System.out.println(jxNodes); System.out.println("__________________________");
List<JXNode> jxNode = jxDocument.selN("//student[@number='heima_0001']");
System.out.println(jxNode);
}
}
XML解析之Jsoup的更多相关文章
- xml解析技术
本文总结Dom,sax解析, 使用Java作为工具解析xml文档. 1 Dom 综述:Dom解析xml通常也称为xmlDom (和htmlDom技术差不多),将xml文档封装成树,好处就是xml中的 ...
- Duilib源码分析(三)XML解析器—CMarkup
上一节介绍了控件构造器CDialogBuilder,接下来将分析其XML解析器CMarkup: CMarkup:xml解析器,目前内置支持三种编码格式:UTF8.UNICODE.ASNI,默认为UTF ...
- JSON解析和XML解析对比
JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和 ...
- 【Android】实现XML解析的几种技术
本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...
- 定位和xml解析和gson解析加上拉加载,下拉刷新
这里的上拉加载,下拉刷新用到是依赖包 Mainactivity,xml解析和定位 package com.exmple.autolayout; import java.util.List; impor ...
- tinyxml一个优秀的C++ XML解析器
读取和设置xml配置文件是最常用的操作,试用了几个C++的XML解析器,个人感觉TinyXML是使用起来最舒服的,因为它的API接口和Java的十分类似,面向对象性很好. TinyXML是一个开源的解 ...
- PERL/LEX/YACC技术实现文本解析--XML解析
继周六的p_enum.pl后,再来一篇说说我用perl做的lex,yacc工具.之前说了,我学习lex和yacc的最初动机是为了做个C语言解释器的SHELL:但后来工作中的实际需要也是制作perl版l ...
- 基本XML解析---编写
#import "ViewController.h" #import "DDXML.h" @interface ViewController () @end @ ...
- iOS-数据解析XML解析的多种平台介绍
在iPhone开发中,XML的解析有很多选择,iOS SDK提供了NSXMLParser和libxml2两个类库,另外还有很多第三方类库可选,例如TBXML.TouchXML.KissXML.Tiny ...
随机推荐
- MySQL视图的优缺点以及如何创建视图
视图,虚拟表,从一个表或多个表中导出来的表,作用和真实表一样,包含一系列带有行和列的数据 视图中,用户可以使用SELECT语句查询数据,也可以使用INSERT,UPDATE,DELETE修改记录,视图 ...
- Ubuntu 查看已安装软件
apt list --installed dpkg -l
- Redis分布式篇
Redis分布式篇 1 为什么 需要 Redis 集群 1.1 为什么需要集群? 1.1.1 性能 Redis 本身的 QPS 已经很高了,但是如果在一些并发量非常高的情况下,性能还是会受到影响. ...
- 高精度运算略解 在struct中重载运算符
高精度 高精度,即高精度算法,属于处理大数字的数学计算方法.在一般的科学计算中,会经常算到小数点后几百位或者更多,当然也可能是几千亿几百亿的大数字. 重载运算符 运算符重载,就是对已有的运算符重新进行 ...
- win10系统 plsql developer启动慢
win10系统plsql启动慢一般原因是plsql打印设置的问题,若默认打印机设置为网络上某一位置的打印机,则plsql启动时会去寻找该打印机,导致启动很慢. 解决办法1 直接禁止print spoo ...
- java集合之Stack栈基础
Stack堆栈: 是后进先出(LIFO)的对象堆栈,继承Vector—AbstractList--AbstractCollection类,底层是通过数组实现, boolean empty() 判断堆栈 ...
- vue 详情跳转至列表页 实现列表页缓存
甲爸爸提了一个需求,希望公众号内的商城能够像app一样,从商品详情页跳转至列表页及其他列表页时,可以实现列表页缓存(数据不刷新.位置固定到之前点的商品的位置) 本来想着scrollBehavior应该 ...
- docker实验--redis集群搭建
背景介绍: 我经常在做一些小项目的时候,采用了Redis来做缓存,但是都是基于单节点的,一旦redis挂了,整个项目就挂了.于是乎,想到了多节点集群的方式来使用,就开始折腾着怎么去搭建这个集群.在网上 ...
- 如何定制 Spring Boot 的 Banner?
相信用过 Spring Boot 的朋友们一定在启动日志中见过类似如下的内容,比如在启动 Spring Boot 时,控制台默认会打印 Spring Boot Logo 以及版本信息,这是 Sprin ...
- netty源码解析(4.0)-26 ByteBuf内存池:PoolArena-PoolSubpage
PoolChunk用来分配大于或等于一个page的内存,如果需要小于一个page的内存,需要先从PoolChunk中分配一个page,然后再把一个page切割成多个子页-subpage,最后把内存以s ...