xml解析之Jsoup器
Jsoup介绍
- 百度百科:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。
Jsoup使用
导包
平时代码例子
新建一个xml文件。我放在src目录下
<?xml version="1.0" encoding="UTF-8" ?> <Programmers> <Programmer id="p1"> <name>马对钱无趣</name> <age>56</age> <code> <p>这是p标签</p> </code> </Programmer> <Programmer id="p2"> <name>刘不知妻美</name> <age>54</age> <code>null</code> </Programmer> </Programmers>
获取programmers标签所有数据,以及其文本
JsoupDemo1代码
package com.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.*;
/**
* @author 林高禄
* @create 2020-07-02-11:57
*/
public class JsoupDemo1 {
public static void main(String[] args) throws IOException {
String path = JsoupDemo1.class.getClassLoader().getResource("jsoupTest.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
Elements elements = document.getElementsByTag("Programmers");
System.out.println(elements);
System.out.println("---------------------");
// 遍历获取文本
elements.forEach(s-> System.out.println(s.text()));
System.out.println("---------------------");
// 直接获取文本,内部自动遍历
System.out.println(elements.text());
}
}
运行输出
<programmers>
<programmer id="p1">
<name>
马对钱无趣
</name>
<age>
56
</age>
<code> <p>这是p标签</p> </code>
</programmer>
<programmer id="p2">
<name>
刘不知妻美
</name>
<age>
54
</age>
<code>null</code>
</programmer>
</programmers>
---------------------
马对钱无趣 56 这是p标签 刘不知妻美 54 null
---------------------
马对钱无趣 56 这是p标签 刘不知妻美 54 null
获取id为p1的程序员的代码
package com.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;
/**
* @author 林高禄
* @create 2020-07-02-11:57
*/
public class JsoupDemo2 {
public static void main(String[] args) throws IOException {
String path = JsoupDemo2.class.getClassLoader().getResource("jsoupTest.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
Element p2 =document.getElementById("p1");
Elements code = p2.getElementsByTag("code");
// 标签下的所有内容
System.out.println(code.get(0).html());
System.out.println("------------------------------");
// 标签下的文本
System.out.println(code.get(0).text());
}
}
运行输出:
<p>这是p标签</p>
------------------------------
这是p标签
可见html和text是有区别的
快捷查询
selector选择器
- 使用方法:Elements select(String cssQuery),cssQuery类似CSS中标签、id、类选择器等
- 语法:参考selector类中定义的语法
查询所有年龄
package com.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
/**
* @author 林高禄
* @create 2020-07-02-11:57
*/
public class JsoupDemo3 {
public static void main(String[] args) throws IOException {
String path = JsoupDemo3.class.getClassLoader().getResource("jsoupTest.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
// 查询age标签
Elements age = document.select("age");
System.out.println(age.text());
}
}
运行输出:
56 54
获取id为p2的人的名字
package com.jsoup;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.select.Elements;
import java.io.File;
import java.io.IOException;
/**
* @author 林高禄
* @create 2020-07-02-11:57
*/
public class JsoupDemo4 {
public static void main(String[] args) throws IOException {
String path = JsoupDemo4.class.getClassLoader().getResource("jsoupTest.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
// 获取id为p2的人的名字,Programmer[id="p2"]标识id为p2的Programmer,> name为直接子name标签
Elements select = document.select("Programmer[id=\"p2\"] > name");
System.out.println(select.text());
}
}
运行输出:
刘不知妻美
xpath
概念
百度百科:XPath即为XML路径语言(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。
使用
xpath是独立的,所以Jsoup要使用xpath,得导入相关的jar包
语法
xpath的语法,打开W3school,找到xpath
获取所有人的名字
package com.jsoup;
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 java.io.File;
import java.io.IOException;
import java.util.List;
/**
* @author 林高禄
* @create 2020-07-02-11:57
*/
public class JsoupDemo5 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
String path = JsoupDemo5.class.getClassLoader().getResource("jsoupTest.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
// 获取xpath的相关对象
JXDocument jxDocument = new JXDocument(document);
// 获取所有人名字
List<JXNode> jxNodes = jxDocument.selN("//name");
System.out.println(jxNodes);
System.out.println("----------------------------");
jxNodes.forEach(s-> System.out.println(s.getElement().text()));
}
}
运行输出:
[<name>
马对钱无趣
</name>, <name>
刘不知妻美
</name>]
----------------------------
马对钱无趣
刘不知妻美
获取id为p1的程序员的代码
package com.jsoup;
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 java.io.File;
import java.io.IOException;
import java.util.List;
/**
* @author 林高禄
* @create 2020-07-02-11:57
*/
public class JsoupDemo6 {
public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
String path = JsoupDemo6.class.getClassLoader().getResource("jsoupTest.xml").getPath();
Document document = Jsoup.parse(new File(path), "utf-8");
// 获取xpath的相关对象
JXDocument jxDocument = new JXDocument(document);
// 获取id为p1的程序员的代码
// 虽然在xml中是Programmer,但是这里要写programmer,要小写,不然查不到
List<JXNode> jxNodes1 = jxDocument.selN("//Programmer");
System.out.println(jxNodes1);
System.out.println("-------------------------------");
List<JXNode> jxNodes2 = jxDocument.selN("//programmer[@id='p1']/code");
System.out.println(jxNodes2.get(0).getElement().text());
}
}
运行输出:
[]
-------------------------------
这是p标签
上一篇: XML解析
下一篇: 解析dump的几种方式