1: 概述
* 代碼:
//2.1擷取student.xml的path
String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath();
//2.2解析xml文檔,加載文檔進記憶體,擷取dom樹--->Document
Document document = Jsoup.parse(new File(path), "utf-8");
//3.擷取元素對象 Element
Elements elements = document.getElementsByTag("name");
System.out.println(elements.size());
//3.1擷取第一個name的Element對象
Element element = elements.get(0);
//3.2擷取資料
String name = element.text();
System.out.println(name);
* 對象的使用:
1. 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的文檔對象
2. Document:文檔對象。代表記憶體中的dom樹
* 擷取Element對象
- * getElementById(String id):根據id屬性值擷取唯一的element對象
- * getElementsByTag(String tagName):根據标簽名稱擷取元素對象集合
- * getElementsByAttribute(String key):根據屬性名稱擷取元素對象集合
- * getElementsByAttributeValue(String key, String value):根據對應的屬性名和屬性值擷取元素對象集合
- 3. Elements:元素Element對象的集合。可以當做 ArrayList<Element>來使用
4. 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():擷取标簽體的所有内容(包括字标簽的字元串内容)
所用到的資料:
<?xml version="1.0" encoding="UTF-8"?>
<users>
<user id='1'>
<name>zhangsan</name>
<age>23</age>
<gender>male</gender>
<address>環湖中路36</address>
</user>
<user id='2'>
<name>lisi</name>
<age>24</age>
<gender>female</gender>
</user>
</users>
層次關系:
1:Document 是一個xml檔案的dom樹,表示一個xml檔案
2:Elements 表示多個元素(ELEMENT)的集合 findElementXXX() selectot() SetN() 系列API 傳回的都是一個集合
3:Element 表示一個元素,xml了解為一個閉合的标簽
2: 應用場景
2.1 有類封裝的 強制性解析 , 1: 類隻需要三個屬性, 但是xml屬性多了 是以不能擷取跟節點直接使用text()進行解析, 2: 按照正常周遊的方式進行解析
public class ParseFromStudent {
public static void main(String[] args) throws IOException {
String path = "E:\\GItHubRepository\\Lear-Java\\java-growing\\src\\main\\java\\xml_jsoup\\Student.xml";
Document dom = Jsoup.parse(new File(path), "UTF-8");
class Student {
String name;
int age;
String gender;
public Student(String name, int age, String gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
}
Elements element = dom.getElementsByTag("user");
ArrayList<Student> slist = new ArrayList<>();
// element.forEach(v->System.out.println(v));
Iterator<Element> it = element.iterator();
while (it.hasNext()) {
Element next = it.next();
Elements childrens = next.children();
Iterator<Element> it_child = childrens.iterator();
String name = null;
int age = 0;
String gender = null;
while (it_child.hasNext()) {
Element child_node = it_child.next();
switch (child_node.nodeName()) {
case "name":
name=child_node.text();
break;
case "age":
age=Integer.parseInt(child_node.text());
break;
case "gender":
gender=child_node.text();
break;
}
}
slist.add(new Student(name, age, gender));
}
System.out.println(slist);
}
}
有限制的用法:
public class ParseFromStudent2 {
public static void main(String[] args) throws IOException {
String path = "E:\\GItHubRepository\\Lear-Java\\java-growing\\src\\main\\java\\xml_jsoup\\Student.xml";
Document dom = Jsoup.parse(new File(path), "UTF-8");
class Student {
String name;
int age;
String gender;
public Student(String name, int age, String gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
}
ArrayList<Student> list = new ArrayList<>();
Elements element = dom.getElementsByTag("user");
Iterator<Element> it = element.iterator();
Student stu=null;
/**
* 1: 這裡是有局限性的 如果我們要的資料 中間穿插幾個不需要的資料,或者xml文檔以後變化 了 那麼我們還得需要改代碼
* 2: 最好的方式就行是使用比對的方式, 無論 xml源檔案 怎麼發生變化, 最初的解析版本還是能夠使用的
*/
while(it.hasNext()) {
Element next = it.next();
String[] split = next.text().split(" ");
stu=new Student(split[0], Integer.parseInt(split[1]), split[2]);
list.add(stu);
}
System.out.println(list);
}
}
最好的方式:前面提到的問題,都解決了
public class ParseFromStudent3 {
public static void main(String[] args) throws IOException {
String path = "E:\\GItHubRepository\\Lear-Java\\java-growing\\src\\main\\java\\xml_jsoup\\Student.xml";
Document dom = Jsoup.parse(new File(path), "UTF-8");
class Student {
String name;
int age;
String gender;
public Student(String name, int age, String gender) {
super();
this.name = name;
this.age = age;
this.gender = gender;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + ", gender=" + gender + "]";
}
}
ArrayList<Student> list = new ArrayList<>();
Elements element = dom.getElementsByTag("user");
Iterator<Element> it = element.iterator();
Student stu=null;
/**
* 使用selector 文法
*/
while(it.hasNext()) {
Element next = it.next();
Elements name = next.select("name");
Elements age = next.select("age");
Elements gender = next.select("gender");
stu=new Student(name.text(), Integer.parseInt(age.text()), gender.text());
list.add(stu);
}
System.out.println(list);
BigInteger bigi = new BigInteger("1");
for(int i=1;i<=100;i++){
bigi=bigi.multiply(new BigInteger(i+""));
}
System.out.println(bigi);
}
}
3: Xpath 應用
2. XPath:XPath即為XML路徑語言,它是一種用來确定XML(标準通用标記語言的子集)文檔中某部分位置的語言
* 使用Jsoup的Xpath需要額外導入jar包。
* 查詢w3cshool參考手冊,使用xpath的文法完成查詢
* 代碼:
//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屬性值為itcast
List<JXNode> jxNodes4 = jxDocument.selN("//student/name[@id='itcast']");
for (JXNode jxNode : jxNodes4) {
System.out.println(jxNode);
}