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 ...
随机推荐
- CSS中颜色表示方法及颜色表
一:直接用颜色的英文名表示 二:RGB(x,y,z)函数表示,x.y.z.分别是红色.绿色.蓝色的值,x,y,z∈[0,225],亦可用百分比表示:对比rgba(x,y,z,a)中a是alpha通道设 ...
- Linux提权中常见命令大全
在拿到一个 webshell 之后,大家首先会想到去把自己的权限提升到最高,windows 我们会提升到 SYSTEM 权限,而 Linux 我们会提升到 root 权限,拿在进行 Linux 提权的 ...
- 3. Rsync-远程同步(下)-企业案例
已知3台服务器主机名分别为web01.backup .nfs主机信息见下表: 角色 外网IP(NAT) 内网IP(LAN) 主机名 WEB eth0:10.0.0.7 eth1:172.16.1.7 ...
- Redis启动报错解决
报错 redis_6379.service - LSB: start and stop redis_6379 Loaded: loaded (/etc/rc.d/init.d/redis_637 ...
- C语言 二叉树的遍历(递归和非递归)
#include <iostream> #include <cstdio> #include "biTree.h" #include "cstdl ...
- OptimalSolution(7)--大数据和空间限制
一.布隆过滤器 问题:不安全网页的黑名单包含100亿个黑名单网页,每个网页的URL最多占用64B.现在想要实现一种网页过滤系统,可以根据网页的URL判断该网页是否在黑名单上,如何设计该系统. 要求:允 ...
- Bigo的Java面试,我挂在了第三轮技术面上.........
背景 前段时间家里出了点事,辞职回家待了一段时间,处理完老家的事情后就回到广州这边继续找工作,大概是国庆前几天我去面试了一家叫做Bigo(YY的子公司),面试的职位是面向3-5年的Java开发,最终自 ...
- Ubuntu 16 server 安装 tensorflow-GPU
目录 显卡驱动安装 CUDA安装 cuDNN安装 tensorflow-gpu安装 本次使用主机配置: cpu:i7-8700K 显卡:GTX-1080Ti 一.安装显卡驱动 打开命令窗口(c ...
- markdown 入门教程(完整版)
Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式. 1. 标题 Markdown支持6种级别的标题,对应html标签 h1 ~ h6 ...
- 深入理解大数据架构之——Lambda架构
目录 传统系统的问题 Lambda架构简介 Lambda架构关键特性 数据系统的本质 Lambda的三层架构 Lambda架构组件选型 总结 原文链接:https://jiang-hao.com/ar ...