一、Jsoup 解析步骤
Jsoup 中文帮助 API:https://www.open-open.com/jsoup/
步骤:
1、导入 jar 包(官网下载地址:Jsoup 官网)
2、解析 XML 文件
① 得到解析文件的路径:类加载器加载文件的路径
② 构建一个 File 对象
③ 调用 Jsoup 的 parse 方法解析 XML 文件得到一个 Document 对象
④ 调用 Document 的相关方法得到相关的标签对象(Element),Element 就是一个存放了 Element 对象的 ArrayList 集合
⑤ 调用 Element 的相关方法获取数据
XML 文件:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<students>
<student number="0001">
<name id="java">tom</name>
<age>18</age>
<sex>male</sex>
</student>
<student number="0002">
<name>jack</name>
<age>18</age>
<sex>female</sex>
</student>
</students>
解析 XML:
package com.ks.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;
/**
* xml_解析_Jsoup_快速入门
* <p>
* 步骤:
* 1,导入JAR
* 2,解析XML文件
* A,得到解析文件的路径:类加载器加载文件的路径
* B,构建一个FILE对象
* C,调用JSOUP的PARSE方法解析XML文件得到一个DOCUMENT对象
* D,调用Document的相关方法得到相关的标签对象(Element)
* Elements:就是一个存了Element对象的ArrayList集合
* E ,调用Element的相关方法得到想要的数据
*/
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
//1.获取xml解析文件的路径
String path = JsoupDemo1.class.getClassLoader().getResource( "xml/student.xml" ).getPath();
//2.解析xml文档,加载文档进内存,获取 dom 树 --》获取document对象
Document document = Jsoup.parse(new File( path ),"UTF-8");
//3.获取元素对象Element,返回值是存了Element对象的ArrayList集合
Elements name = document.getElementsByTag( "name" );
System.out.println(name.size());
//4.获取第一个name的Element对象
Element element = name.get( 0 );
//5.获取数据
String text = element.text();
System.out.println(text);
}
}
二、Jsoup 对象的使用
1、Jsoup 类
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 的文档对象
Demo:
package jsoup;
/**
* Jsoup对象功能
*/
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import java.io.File;
import java.io.IOException;
import java.net.URL;
public class JsoupDemo2 {
public static void main(String[] args) throws IOException {
//获取xml解析文件的路径
String path = JsoupDemo1.class.getClassLoader().getResource( "xml/student.xml" ).getPath();
//1.解析xml文档,加载文档进内存,获取document对象
Document document = Jsoup.parse(new File( path ),"UTF-8");
//2.parse(String html):解析xml或HTML字符串
String str="<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\n" +
"\n" +
"<students>\n" +
"\t<student number=\"0001\">\n" +
"\t\t<name>tom</name>\n" +
"\t\t<age>18</age>\n" +
"\t\t<sex>male</sex>\n" +
"\t</student>\n" +
"\t<student number=\"0002\">\n" +
"\t\t<name>jack</name>\n" +
"\t\t<age>18</age>\n" +
"\t\t<sex>female</sex>\n" +
"\t</student>\n" +
"</students>";
Document document1 = Jsoup.parse( str );
// System.out.println(document1);
//3.parse(URL url ,int timeoutMillis):通过网络路径获取指定的HTML或xml文档对象
URL url=new URL("https:www.baidu.com");
Document document2 = Jsoup.parse( url,10000);
// System.out.println(document2);
}
}
2、Document 对象
Document 对象:文档对象,代表内存中的 dom 树
获取 Element 对象的方法:
getElementById(String id):根据 id 属性值获取唯一的 element 对象
getElementsByTag(String tagName):根据标签名称获取元素对象集合
getElementsByAttribute(String key):根据属性名称获取元素对象集合
getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
Demo:
package com.ks.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
/**
*Document/Elements对象
*/
public class JsoupDomo3 {
public static void main(String[] args) throws IOException {
String path = JsoupDomo3.class.getClassLoader().getResource( "xml/student.xml" ).getPath();
Document document = Jsoup.parse( new File( path ), "UTF-8" );
//1.获取所有的student对象
Elements student = document.getElementsByTag( "student" );
System.out.println(student);
System.out.println("========================");
//2.获取id属性的元素对象
Elements id = document.getElementsByAttribute( "id" );
System.out.println(id);
System.out.println("========================");
//3.根据id属性值获取唯一的element对象
Elements value = document.getElementsByAttributeValue( "id", "itcast" );
System.out.println(value);
}
}
3、Elements
Elements:元素 Element 对象的集合,可以当做 ArrayList 来使用
4、Element 对象
Element 表示元素对象
(1)获取子元素对象的方法
getElementById(String id):根据 id 属性值获取唯一的 element 对象
getElementsByTag(String tagName):根据标签名称获取元素对象集合
getElementsByAttribute(String key):根据属性名称获取元素对象集合
getElementsByAttributeValue(String key, String value):根据对应的属性名和属性值获取元素对象集合
(2)获取属性值的方法
String attr(String key):根据属性名称获取属性值
(3)获取文本内容
String text():获取所有子标签的纯文本内容
String html():获取标签体的所有内容(包括子标签和标签里面的内容的字符串内容)
Demo:
package com.ks.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;
/**
* Element对象
*/
public class JsoupDemo4 {
public static void main(String[] args) throws IOException {
String path = JsoupDemo4.class.getClassLoader().getResource( "xml/student.xml" ).getPath();
Document document = Jsoup.parse( new File( path ), "UTF-8" );
//通过document获取所有的name标签,可以获取两个
Elements name = document.getElementsByTag( "name" );
System.out.println(name.size());
//通过element对象子标签对象,可以获取一个
Element ele_Student = document.getElementsByTag( "name" ).get( 0 );
Elements els_name = ele_Student.getElementsByTag( "name" );
System.out.println(els_name.size());
//获取student对象的属性值
String number = ele_Student.attr( "number" );
System.out.println(number.length());
//获取文本内容
String text = els_name.text();
String html = els_name.html();
System.out.println(text);
System.out.println(html);
}
}
5、Node 对象
Node 表示节点对象,是 Document 和 Element 的父类
三、Jsoup 快捷查询方式
1、selector 选择器
使用的方法:Elements
Elements select(String cssQuery)
详细语法,参考 JavaAPI 中 Selector 类中定义的语法。
Demo:
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 JsoupDemo {
public static void main(String[] args) throws IOException {
//1.获取student.xml的path
String path = JsoupDemo5.class.getClassLoader().getResource("student.xml").getPath();
//2.获取Document对象
Document document = Jsoup.parse(new File(path), "utf-8");
//3.查询name标签
Elements elements = document.select("name");
System.out.println(elements);
System.out.println("=----------------");
//4.查询id值为java的元素
Elements elements1 = document.select("#java");
System.out.println(elements1);
System.out.println("----------------");
//5.获取student标签并且number属性值为java_0001的age子标签
//5.1.获取student标签并且number属性值为java_0001
Elements elements2 = document.select("student[number=\"java_0001\"]");
System.out.println(elements2);
System.out.println("----------------");
//5.2获取student标签并且number属性值为java_0001的age子标签
Elements elements3 = document.select("student[number=\"java_0001\"] > age");
System.out.println(elements3);
}
}
2、XPath
XPath 即为 xml 路径语言,它是一种用来确定 xml(标准通用标记语言的子级)文档中某部分位置的语言
使用步骤:
(1)使用 Jsoup 的 Xpath 需要额外导入 jar 包。
(2)使用 Xpath 语法完成查询。XPath 语法
Demo:
import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
import cn.wanghaomiao.xpath.model.JXDocument;
import cn.wanghaomiao.xpath.model.JXNode;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
import java.util.List;
/**
*XPath查询
*/
public class JsoupDemo6 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
//1.获取student.xml的path
String path = JsoupDemo6.class.getClassLoader().getResource("student.xml").getPath();
//2.获取Document对象
Document document = Jsoup.parse(new File(path), "utf-8");
//3.根据document对象,创建JXDocument对象
JXDocument jxDocument = new JXDocument(document);
//4.结合xpath语法查询
//4.1查询所有student标签
List<JXNode> jxNodes = jxDocument.selN("//student");
for (JXNode jxNode : jxNodes) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.2查询所有student标签下的name标签
List<JXNode> jxNodes2 = jxDocument.selN("//student/name");
for (JXNode jxNode : jxNodes2) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.3查询student标签下带有id属性的name标签
List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id]");
for (JXNode jxNode : jxNodes3) {
System.out.println(jxNode);
}
System.out.println("--------------------");
//4.4查询student标签下带有id属性的name标签 并且id属性值为java
List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='java']");
for (JXNode jxNode : jxNodes4) {
System.out.println(jxNode);
}
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· DeepSeek R1 简明指南:架构、训练、本地部署及硬件要求
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· 面试官:你是如何进行SQL调优的?