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 ...
随机推荐
- idea 添加 注释 配置
为类添加自动注释模版 File-->Settings-->Editor-->File and Code Templates 启用该模板才有效一定要勾上 /** * @author : ...
- bcache 状态/配置 文件详细介绍(翻译自官网)
声明: 文中 斜体带下划线 的段落为翻译不够准确的段落 原文:https://www.kernel.org/doc/Documentation/bcache.txt 官网:https://bcach ...
- opencv::自定义线性滤波
卷积概念 常见算子 自定义卷积模糊 卷积概念 1.卷积是图像处理中一个操作,是kernel在图像的每个像素上的操作. 2.Kernel本质上一个固定大小的矩阵数组,其中心点称为锚点(anchor po ...
- Java类型信息(RTTI和反射)
要想在IT领域站得住脚,必须得不断地学习来强化自己,但是学过的技术不实践很容易便被遗忘,所以一直都打算开个博客,来记录自己学的知识,另外也可以分享给有需要的人! 最近在学习反射,为了更好地理解反射,就 ...
- 百万年薪python之路 -- re模块
re模块 re模块是python用来描述正则表达式的一个模块. 正则表达式本身也和python没有什么关系,就是匹配字符串内容的一种规则. 官方定义:正则表达式是对字符串操作的一种逻辑公式,就是用事先 ...
- LeetCode 84--柱状图中最大的矩形( Largest Rectangle in Histogram) 85--最大矩形(Maximal Rectangle)
84题和85五题 基本是一样的,先说84题 84--柱状图中最大的矩形( Largest Rectangle in Histogram) 思路很简单,通过循环,分别判断第 i 个柱子能够延展的长度le ...
- Element filtername is not allowed here-web.xml version="3.0"-intellij idea
Element filtername is not allowed here-web.xml version="3.0"-intellij idea Intellij IDEA 报 ...
- 计算机基础之编程 + 基本组成 + 组成补充 + 操作系统(day01整理)
目录 一 计算机基础之编程 (一) 什么是编程语言 (二) 什么是编程 (三) 为什么要编程 二 计算机的基本组成 (一) CPU(大脑) (1) 控制器 (2) 运算器 (二) 存储器(记忆) (1 ...
- 2018.8.8 python 初识函数
主要内容: 1.函数定义 2.函数名,函数体以及函数的调用 3.函数的返回值 4.函数的参数 一.函数的定义 函数:对代码块和功能的封装和定义. 二.函数名.函数体及函数的调用 我们使用def关键字来 ...
- swift ARC中的strong、weak、unowned
Swift 用自动引用计数ARC(Automatic Reference Counting)方式来跟踪和管理app的内存使用.这使得内存管理成为swift内部的机制,不需要认为考虑.ARC会自动释放那 ...