隨着json等一些技術的普及,彷佛xml的路子愈來愈窄,雖然xml的一些功能被其餘的一些技術代替,可是學習xml仍是很是有必要,若是用xml存儲一些大量數據,仍是有必定優點的,就算你無論這些,可是現有的不少框架以及技術的配置文件都存在於xml中,最起碼你得對它的結構以及一些基本用法有必定了解
XML:Extensible Markup Language:可擴展標記型語言css
標記型:使用標籤來操做,html就是一種常見的標記型語言html
可擴展:能夠自定義標籤,甚至能夠用中文寫標籤 Eg:<person></person
<張三><張三>
java
xml 主要用來存儲數據,體如今做配置文件,或者充當小型數據庫,在網絡中傳輸數據node
A:配置文件:例如配置mysql數據庫mysql
前面咱們經常書寫 一個 jdbc.properties文件來作配置文件,好處呢就是若是想修改數據庫的信息,不須要修改源代碼,只要修改配置文件就能夠了,而xml也能夠做爲配置文件來使用sql
url=jdbc:mysql://localhost:3306/db1 user=root password=root99 driver=com.mysql.jdbc.Driver
<!--例如模擬配置mysql數據庫 只爲假設,與前面知識對應,實際配置文件後期會很常見--> <?xml version="1.0" encoding="UTF-8"?> <config> <dbinfo> <dbDriver>com.mysql.jdbc.Driver</dbDriver> <dbUrl>jdbc:mysql://localhost:3306/db1</dbUrl> <username>root</username> <password>root99</password> </config>
B:充當小型數據庫數據庫
咱們能夠在xml中存儲一些數據,讓它充當一個小型的數據庫apache
<?xml version="1.0" encoding="UTF-8"?> <student> <stu> <id>001</id> <name>zhangsan</name> <age>20</age> </stu> <stu> <id>002</id> <name>lisi</name> <age>30</age> </stu> </student>
C:傳輸數據編程
在網絡編程中,咱們或多或少接觸過,例如如何實現一個簡單的聊天室,基本原理是這樣的,一個服務器端,多個客戶端,當客戶端1發送數據後,服務器端接收到數據,而且對數據進行必定的審覈(是否有非法敏感字)以及格式的處理,再將數據發送到每個客戶端中
剛開始的時候,咱們通常選擇使用字符串直接傳遞內容,可是卻不是很利於程序的後期維護,而使用xml就能對後期程序的維護更加友好json
<?xml version="1.0" encoding="UTF-8"?> <message id="1"> <sender>帳號1</sender> <getter>帳號2</getter> <content>發送的信息</content> <ip>ip地址</ip> </message>
xml文檔的後綴名爲 .xml
建立一個xm文件後,第一步就是 必需要有 一個文檔聲明(寫了文檔聲明以後,表寫xml文件的內容)
<?xml version="1.0" encoding="UTF-8"?>
encoding:xml編碼 常見編碼: GBK、UTF-八、ISO8859-1(不包含中文)
注意事項:
<person></peoson>
<aa><bb></bb></aa>
名稱規則:
<person id1="aaa" id2="bbb"></person>
<?xml version="1.0" encoding="UTF-8"?> <!-- xml註釋 -->
註釋不能嵌套,而且不能放到第一行,第一行必須方式文檔聲明
若是想在xml中輸入特殊字符,須要對字符進行轉義,由於 < 等會被當作標籤
字符 | 轉義字符 | 描述 |
---|---|---|
& | & | 和 |
< | < | 小於號 |
> | > | 大於號 |
" | " | 雙引號 |
' | ' | 單引號 |
若多個字符都須要轉義,則能夠將這些內容存放到CDATA裏面
<![CDATA[ 內容 ]]>
能夠在xml設置樣式
<?xml-stylesheet type="text/css" href="css的路徑"?>
爲何須要用到約束呢?好比咱們如今定義一個 student.xml文件,咱們想要在其中保存關於學生的信息,例如id,name,age,可是若是隨便寫入一個標籤 例如 <你好> 從語法的角度上雖然是符合規範的,可是這顯然與咱們想要存儲的東西沒有任何關係,因此咱們須要經過xml約束技術,約束xml中只能出現的元素
分類:
A:使用內部的dtd文件,即將約束規則定義在xml文檔中
<!DOCTYPE 根元素名稱 [ <!ELEMENT person (name,age)> <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> ]>
B:引入外部的dtd文件
<!DOCTYPE 根元素名稱 SYSTEM "dtd路徑">
C:使用外部的dtd文件(網絡上的dtd文件)
<!DOCTYPE 根元素 PUBLIC "DTD名稱" "DTD文檔的URL"> 例如使用 struts2框架 使用配置文件 所使用 外部的dtd文件 <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd">
<!ELEMENT 元素名 約束>
A:簡單元素(沒有子元素)
ELEMENT name (#PCDATA)> (#PCDATA): 約束name是字符串類型 EMPTY : 元素爲空(沒有內容) - <sex></sex> ANY:任意
B:複雜元素
<!-- 語法 --> <!ELEMENT person (id,name,age,)> 子元素只能出現一次 <!ELEMENT 元素名稱 (子元素)> <!-- 子元素出現次數 --> * :一次多或屢次 ?:零次或一次 * :零次或屢次 <!-- 子元素直接使用逗號隔開 --> 表示元素出現的順序 <!-- 子元素直接使用 | --> 表示元素只能出現其中的任意一個
<!-- 語法 --> <!ATTLIST 元素名稱 屬性名稱 屬性類型 屬性的約束 > <!-- 屬性類型 --> CDATA: 字符串 <!ATTLIST birthday ID1 CDATA #REQUIRED > <!-- 枚舉 --> 表示只能在必定的範圍內出現值,可是隻能每次出現其中的一個,紅綠燈效果 <!ATTLIST age ID2 (AA|BB|CC) #REQUIRED > <!-- ID: 值只能是字母或者下劃線開頭 --> <!ATTLIST name ID3 ID #REQUIRED > <!-- 屬性的約束 --> #REQUIRED:屬性必須存在 #IMPLIED:屬性無關緊要 #FIXED: 表示一個固定值 #FIXED "AAA" 屬性的值必須是設置的這個固定值 <!ATTLIST sex ID4 CDATA #FIXED "ABC" > 直接值 不寫屬性,使用直接值 寫了屬性,使用設置那個值 <!ATTLIST school ID5 CDATA "WWW" >
schema 符合 xml 的語法,一個 xml 中能夠有多個 schema ,多個 schema 使用名稱空間區分(相似於java包名)dtd 裏面有PCDATA類型,可是在 schema 裏面能夠支持更多的數據類型
後綴名:xsd
引入: 填寫xml文檔的根元素 引入xsi前綴. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 表示xml文件是一個約束文件 引入xsd文件命名空間. xsi:schemaLocation="http://www.bwh.cn/xml student.xsd" 使用一個使用schema約束文件,直接經過這個地址引入約束文件 一般使用一個url地址防止重名 爲每個xsd約束聲明一個前綴,做爲標識 xmlns="http://www.bwh.cn/xml"
(1) 看xml中有多少個元素
<element>
(2) 看簡單元素和複雜元素
<element name="person"> <complexType> <sequence> <element name="name" type="string"></element> <element name="age" type="int"></element> </sequence> </complexType> </element>
(3) 被約束文件裏面引入約束文件
<person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.bwh.cn/20151111" xsi:schemaLocation="http://www.bwh.cn/20151111 1.xsd"> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" -- 表示xml是一個被約束文件 xmlns="http://www.bwh.cn/20151111" -- 是約束文檔裏面 targetNamespace xsi:schemaLocation="http://www.bwh.cn/20151111 1.xsd"> -- targetNamespace 空格 約束文檔的地址路徑
能夠約束屬性
A: <sequence>:表示元素的出現的順序 B: <all>: 元素只能出現一次 C: <choice>:元素只能出現其中的一個 D: maxOccurs="unbounded": 表示元素的出現的次數 E: <any></any>:表示任意元素 寫在複雜元素裏面 寫在 </complexType>以前 -- <attribute name="id1" type="int" use="required"></attribute> - name: 屬性名稱 - type:屬性類型 int stirng - use:屬性是否必須出現 required
很簡單的理解解析:有一個xml,在其中讀取出須要的數據
DOM:根據xml的層級結構在內存中分配一個樹形結構,把xml的標籤,屬性和文本都封裝成對象,一次性加載進內存
SAX:採用事件驅動,邊讀邊解析,解析到某一個對象,返回對象名稱
想要解析xml,咱們必須瞭解解析器,不一樣的公司和組織,提供了針對dom和sax方式的解析器,經過api方式提供 (今天着重講解兩種比較經常使用的)
注意:下面的全部java代碼中,因爲個人代碼寫在Module中,因此路徑加了名字,若直接建立的是項目,只寫src/s1.xml便可
<?xml version="1.0" encoding="UTF-8"?> <student> <stu id1="love"> <name>zhangsan</name> <age>20</age> </stu> <stu> <name>lisi</name> <age>30</age> </stu> </student>
※ 使用dom4j實現查詢xml操做
(一)查詢全部name元素裏面的值
package cn.ideal.xml.dom4j; /* 一、建立解析器 二、獲得document 三、獲得根節點 getRootElement() 返回Element 四、獲得全部的p1標籤 * elements("p1") 返回list集合 * 遍歷list獲得每個p1 五、獲得name * 在p1下面執行 element("name")方法 返回Element 六、獲得name裏面的值 * getText方法獲得值 */ import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.util.List; public class TestDom4j1 { //查詢xml中全部name元素的值 public static void main(String[] args) throws DocumentException { //建立解析器 SAXReader saxReader = new SAXReader(); //獲得document Document document = saxReader.read("code-04_xml/src/s1.xml"); //獲得根節點 Element rootElement = document.getRootElement(); //獲得stu List<Element> list = rootElement.elements("stu"); //遍歷list for (Element element : list) { //element是每個元素 //獲得name裏面的值 Element name1 = element.element("name"); //獲得name裏面的值 String s = name1.getText(); System.out.println(s); } } } //運行結果 zhangsan lisi
(二)查詢第一個name元素的值
package cn.ideal.xml.dom4j; /* 一、建立解析器 二、獲得document 三、獲得根節點 四、獲得第一個stu元素 element("stu")方法 返回Element 五、獲得p1下面的name元素 element("name")方法 返回Element 六、獲得name元素裏面的值 getText方法 */ import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; public class TestDom4j2 { public static void main(String[] args) throws DocumentException { //建立解析器 SAXReader saxReader = new SAXReader(); //獲得document對象 Document document = saxReader.read("code-04_xml/src/s1.xml"); //獲得根節點 Element rootElement = document.getRootElement(); //獲得第一個stu元素 Element stu = rootElement.element("stu"); //獲得stu下面的name元素 Element name1 = stu.element("name"); //獲得name的值 String s1 = name1.getText(); System.out.println(s1); } } //運行結果 zhangsan
(三)獲取第二個name元素的值
package cn.ideal.xml.dom4j; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; import java.util.List; /* 一、建立解析器 二、獲得document 三、獲得根節點 四、獲得全部的stu 返回 list集合 五、遍歷獲得第二個stu 使用list下標獲得 get方法,集合的下標從 0 開始,想要獲得第二個值,下標寫 1 六、獲得第二個p1下面的name element("name")方法 返回Element 七、獲得name的值 getText方法 */ public class TestDom4j3 { public static void main(String[] args) throws DocumentException { //建立解析器 SAXReader saxReader = new SAXReader(); //獲得document Document document = saxReader.read("code-04_xml/src/s1.xml"); //獲得根節點 Element rootElement = document.getRootElement(); //獲得全部stu List<Element> list = rootElement.elements("stu"); //獲得第二個stu Element stu2 = list.get(1); //獲得stu下的name Element name2 = stu2.element("name"); //獲得name裏面的值 String s2 = name2.getText(); System.out.println(s2); } }
※ 使用dom4j實現添加操做
(一)在第一個p1標籤末尾添加一個元素 <sex>male</sex>
package cn.ideal.xml.dom4j; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import java.io.FileOutputStream; /* 一、建立解析器 二、獲得document 三、獲得根節點 四、獲取到第一個p1 使用element方法 五、在p1下面添加元素 在p1上面直接使用 addElement("標籤名稱")方法 返回一個Element 六、在添加完成以後的元素下面添加文本 在sex上直接使用 setText("文本內容")方法 七、回寫xml 格式化 OutputFormat,使用 createPrettyPrint方法,表示一個漂亮的格式 使用類XMLWriter 直接new 這個類 ,傳遞兩個參數 第一個參數是xml文件路徑 new FileOutputStream("路徑") 第二個參數是格式化類的值 */ public class TestDom4j4 { public static void main(String[] args) throws Exception { //建立解析器 SAXReader saxReader = new SAXReader(); //獲得document Document document = saxReader.read("code-04_xml/src/s1.xml"); //獲得根節點 Element rootElement = document.getRootElement(); //獲得第一個stu元素 Element stu = rootElement.element("stu"); //在stu下面直接添加元素 Element sex1 = stu.addElement("sex"); //在sex下面添加文本 sex1.setText("male"); //回寫xml OutputFormat prettyPrint = OutputFormat.createPrettyPrint();//有縮進效果 XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("code-04_xml/src/s1.xml"), prettyPrint); xmlWriter.write(document); } }
寫一個工具類,簡化操做
封裝方法的操做,能夠省略建立解析器 獲得document 以及回寫xml的方法,把傳遞的文件路徑,封裝成一個常量
好處:能夠提升開發速度,能夠提交代碼可維護性
好比想要修改文件路徑(名稱),這個時候只須要修改常量的值就能夠了,其餘代碼不須要作任何改變
package cn.ideal.xml.utils; import org.dom4j.Document; import org.dom4j.DocumentException; import org.dom4j.io.OutputFormat; import org.dom4j.io.SAXReader; import org.dom4j.io.XMLWriter; import java.io.FileOutputStream; import java.io.IOException; public class Dom4jUtils { public static final String PATH = "code-04_xml/src/s1.xml"; //返回document public static Document getDocument(String path) { //建立解析器 SAXReader saxReader = new SAXReader(); //獲得document try { Document document = saxReader.read(path); return document; } catch (DocumentException e) { e.printStackTrace(); } return null; } //回寫xml的方法 public static void xmlWriters(String path, Document document) { try { OutputFormat prettyPrint = OutputFormat.createPrettyPrint();//有縮進效果 XMLWriter xmlWriter = new XMLWriter(new FileOutputStream(path), prettyPrint); xmlWriter.write(document); } catch (IOException e) { e.printStackTrace(); } } }
咱們上面執行添加操做的代碼就能夠簡化爲
package cn.ideal.xml.dom4j; import cn.ideal.xml.utils.Dom4jUtils; import org.dom4j.Document; import org.dom4j.Element; public class TestDom4j5 { public static void main(String[] args) throws Exception { Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH); //獲得根節點 Element rootElement = document.getRootElement(); //獲得第一個stu元素 Element stu = rootElement.element("stu"); //在stu下面直接添加元素 Element sex1 = stu.addElement("sex"); //在sex下面添加文本 sex1.setText("male"); //回寫xml Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document); } }
(二)使用dom4j實如今特定位置添加元素
在第一個stu下面的name標籤前添加 <id>001</id>
package cn.ideal.xml.dom4j; import cn.ideal.xml.utils.Dom4jUtils; import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import java.util.List; /* 一、建立解析器 二、獲得document 三、獲得根節點 四、獲取到第一個p1 五、獲取p1下面的全部的元素 ** elements()方法 返回 list集合 ** 使用list裏面的方法,在特定位置添加元素 ** 首先建立元素 在元素下面建立文本 - 使用DocumentHelper類方法createElement建立標籤 - 把文本添加到標籤下面 使用 setText("文本內容")方法 ** list集合裏面的 add(int index, E element) - 第一個參數是 位置 下標,從0開始 - 第二個參數是 要添加的元素 六、回寫xml */ public class TestDom4j6 { //在第一個stu下面的name標籤前添加<id>001</id> public static void main(String[] args) { Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH); //獲得根節點 Element rootElement = document.getRootElement(); //獲得第一個stu元素 Element stu = rootElement.element("stu"); //獲取stu下所有元素 List<Element> list = stu.elements(); //建立元素 Element id = DocumentHelper.createElement("id"); //在id下面建立文本 id.setText("001"); //在特定位置添加 list.add(0, id); Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document); } }
(三)使用dom4j實現修改節點的操做
修改第一個p1下面的age元素的值爲18
package cn.ideal.xml.dom4j; /* 一、獲得document 二、獲得根節點,而後再獲得第一個p1元素 三、獲得第一個p1下面的age element("")方法 四、修改值是 30 使用setText("文本內容")方法 五、回寫xml */ import cn.ideal.xml.utils.Dom4jUtils; import org.dom4j.Document; import org.dom4j.Element; public class TestDom4j7 { public static void main(String[] args) { //獲得document Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH); //獲得根節點 Element rootElement = document.getRootElement(); //獲得第一個stu元素 Element stu = rootElement.element("stu"); //獲得第一個stu下面的age Element age = stu.element("age"); age.setText("18"); //回寫xml Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document); } }
※ 使用dom4j實現刪除節點的操做
package cn.ideal.xml.dom4j; import cn.ideal.xml.utils.Dom4jUtils; import org.dom4j.Document; import org.dom4j.Element; public class TestDom4j8 { public static void main(String[] args) { //獲得document Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH); //獲得根節點 Element rootElement = document.getRootElement(); //獲得第一個stu元素 Element stu = rootElement.element("stu"); //獲得第一個stu下面的age Element id = stu.element("id"); stu.remove(id); //回寫xml Dom4jUtils.xmlWriters(Dom4jUtils.PATH, document); } }
※ 使用dom4j獲取屬性的操做
package cn.ideal.xml.dom4j; import cn.ideal.xml.utils.Dom4jUtils; import org.dom4j.Document; import org.dom4j.Element; public class TestDom4j9 { public static void main(String[] args) { //獲得document Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH); //獲得根節點 Element rootElement = document.getRootElement(); //獲得第一個stu元素 Element stu = rootElement.element("stu"); //獲得stu裏面的屬性值 String value = stu.attributeValue("id1"); System.out.println(value); } }
XPath即爲XML路徑語言(XML Path Language),它是一種用來肯定XML文檔中某部分位置的語言
默認的狀況下,dom4j不支持xpath
若是想用,須要引入支持xpath的jar包,使用 jaxen-1.1-beta-6.jar
第一種形式 /AAA/CCC/BBB: 表示一層一層的,AAA下面CCC下面的BBB 第二種形式 //BBB: 表示和這個名稱相同,表示只要名稱是BBB,都獲得 第三種形式 /*: 全部元素 第四種形式 BBB[1]: 表示第一個BBB元素 BBB[last()]:表示最後一個BBB元素 第五種形式 //BBB[@id]: 表示只要BBB元素上面有id屬性,都獲得 第六種形式 //BBB[@id='b1'] 表示元素名稱是BBB,在BBB上面有id屬性,而且id的屬性值是b1
dom4j裏面提供了兩個方法,用來支持xpath
//獲取多個節點 selectNodes("xpath表達式") //獲取一個節點 selectSingleNode("xpath表達式")
(一)使用xpath實現:查詢xml中全部name元素的值
package cn.ideal.xml.dom4j.xpath; import cn.ideal.xml.utils.Dom4jUtils; import org.dom4j.Document; import org.dom4j.Node; import java.util.List; public class TestDom4jXpath1 { //查詢xml中全部name元素的值 public static void main(String[] args) { //獲得document Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH); //獲取全部name元素 List<Node> list = document.selectNodes("//name"); //遍歷list集合 for (Node node : list) { //node是每個name元素 //獲得name元素裏面的值 String s = node.getText(); System.out.println(s); } } }
(二)使用xpath實現:獲取第一個stu下面的name的值
package cn.ideal.xml.dom4j.xpath; import cn.ideal.xml.utils.Dom4jUtils; import org.dom4j.Document; import org.dom4j.Node; public class TestDom4jXpath2 { public static void main(String[] args) { //獲得document Document document = Dom4jUtils.getDocument(Dom4jUtils.PATH); Node name1 = document.selectSingleNode("//stu[@id1='love']/name"); //獲得name裏面的值 String s1 = name1.getText(); System.out.println(s1); } }
package cn.ideal.xml.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; public class JsoupDemo1 { public static void main(String[] args) throws IOException { //獲取Documnet對象 //經過類加載器,獲取student.xml的path String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath(); //解析xml文檔,加載文檔進內存,獲取dom樹 --> Document Document document = Jsoup.parse(new File(path), "utf-8"); //獲取元素對象 Element Elements elements = document.getElementsByTag("name"); //獲取第一個name Element element = elements.get(0); //獲取數據 String name = element.text(); System.out.println(name); } }
對上述經常使用對象的解釋
1. Jsoup:工具類:能夠解析html或xml文檔,返回Document
parse:
//解析xml或html文件 parse (File in, String charsetName) //解析xml或html字符串 parse (String html) //經過網絡路徑獲取指定的html或xml parse (URL url, int timeoutMillis)
2. Document:文檔對象:表明內存中的dom樹
A:獲取Element對象
//根據id屬性值獲取惟一的element對象 getElementById (String id) //根據標籤名稱獲取元素對象集合 getElementsByTag (String tagName) //根據屬性名稱獲取元素對象集合 getElementsByAttribute (String key) //根據對應的屬性名和屬性值獲取元素對象集合 getElementsByAttributeValue (String key, String value)
3. Elements:元素Element對象的集合。能夠近似的認爲 ArrayList<Element>
A:獲取Element對象,同2中
B:獲取屬性值
String attr(String key):根據屬性名稱獲取屬性值
C:獲取文本內容
//獲取文本內容 String text() //獲取標籤體的全部內容 String html()
兩種更加快捷的查詢方式
selector:選擇器
Elements select(String cssQuery) //具體語法,看文檔格式
<?xml version="1.0" encoding="UTF-8"?> <student> <stu number="stu_001"> <name id="ideal">zhangsan</name> <age>18</age> </stu> <stu number="stu_002"> <name>lisi</name> <age>30</age> </stu> </student>
package cn.ideal.xml.jsoup; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.select.Elements; import java.io.File; import java.io.IOException; public class SelectorDemo { public static void main(String[] args) throws IOException { //獲取Documnet對象 //經過類加載器,獲取student.xml的path String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath(); //解析xml文檔,加載文檔進內存,獲取dom樹 --> Document Document document = Jsoup.parse(new File(path), "utf-8"); //查詢name標籤 Elements elements1 = document.select("name"); System.out.println(elements1); System.out.println("--------------"); //查詢id值爲 stu_001 Elements elements2 = document.select("#ideal"); System.out.println(elements2); System.out.println("--------------"); Elements elements3 = document.select("stu[number='stu_001']"); System.out.println(elements3); } } //運行結果 <name id="ideal"> zhangsan </name> <name> lisi </name> -------------- <name id="ideal"> zhangsan </name> -------------- <stu number="stu_001"> <name id="ideal"> zhangsan </name> <age> 18 </age> </stu>
XPath
package cn.ideal.xml.jsoup; 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.util.List; public class XpathDemo { public static void main(String[] args) throws Exception { //獲取Documnet對象 //經過類加載器,獲取student.xml的path String path = JsoupDemo1.class.getClassLoader().getResource("student.xml").getPath(); //解析xml文檔,加載文檔進內存,獲取dom樹 --> Document Document document = Jsoup.parse(new File(path), "utf-8"); //建立JXDocument對象 JXDocument jxDocument = new JXDocument(document); //結合xpath語法查詢 List<JXNode> jxNodes = jxDocument.selN("//stu"); for (JXNode jxNode : jxNodes) { System.out.println(jxNode); } } } //運行結果 <stu number="stu_001"> <name id="ideal"> zhangsan </name> <age> 18 </age> </stu> <stu number="stu_002"> <name> lisi </name> <age> 30 </age> </stu>
//查詢stu標籤下的name標籤 List<JXNode> jxNodes = jxDocument.selN("//student/name"); //查詢stu標籤下帶有id屬性且屬性值ideal的name標籤 List<JXNode> jxNodes = jxDocument.selN("//stu/name[@id='ideal']");
若是內容中有什麼不足,或者錯誤的地方,歡迎你們給我留言提出意見, 蟹蟹你們 !^_^
若是能幫到你的話,那就來關注我吧!(系列文章均會在公衆號第一時間更新)
在這裏的咱們素不相識,卻都在爲了本身的夢而努力 ❤一個堅持推送原創Java技術的公衆號:理想二旬不止