java解析XML詳解
XML的主要用途
- --數(shù)據(jù)存儲(chǔ)和數(shù)據(jù)描述
- --是一個(gè)優(yōu)良的配置文件
- --相當(dāng)于一個(gè)小型數(shù)據(jù)庫(kù)
- --XML不依賴于任何一種編程語(yǔ)言,是獨(dú)立的W3C提供的規(guī)范,所以可以完成多種語(yǔ)言之間的數(shù)據(jù)交換(重點(diǎn))
XML的語(yǔ)法嚴(yán)格,并且完全區(qū)分大小寫
- XML(
eXtensible Markup Language
)-描述事物本身 .xml
XSL (eXtensible Stylesheet Language
)-修飾XML XSL文件也有單獨(dú)的文件,文件后綴 .xsl
通過(guò)以下陳程序引入xsl文件
<?xml-stylesheet type="text/xsl" href="student.xsl"?>
DTD (Docment Type Definition
)-約定xml的標(biāo)簽 在XML文件中只能編寫那些標(biāo)簽,標(biāo)簽中只能編寫那些屬性 DTD有單獨(dú)的文件,文件后綴 .dtd
DTD實(shí)例
Schema-約定xml標(biāo)簽和類型,比DTD編寫更加方便,(約束XML文件) schema有單獨(dú)的文件,文件后綴 .xsd/.xml
實(shí)例是:
<?xml version="1.0" encoding="gb2312"?> <xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"> <xs:element name="叢書"> <xs:complexType> <xs:sequence> <xs:element name="書"> <xs:element name="名" minoccurs="1"></xs:element> <xs:element name="人"></xs:element> <xs:element name="價(jià)"> <xs:attribute name="unit"> <xs:enumeration value="RMB"/> <xs:enumeration value="美元"/> <xs:enumeration value="日元"/> </xs:attribute> </xs:element> </xs:element> </xs:sequence> </xs:complexType> </xs:element> </xs:schema>
可以擴(kuò)展的原因:DTD可以修改
對(duì)比HTML
HTML(Hyper Text Markup language
)
*超文本傳輸標(biāo)記語(yǔ)句(程序員不能自己擴(kuò)展)
*HTML主要用途:做頁(yè)面展示,不會(huì)做數(shù)據(jù)處理
*語(yǔ)法松散,不區(qū)分大小寫
CSS
DTD(Doucment Type Defined
)約束HTML能有那些標(biāo)簽,標(biāo)簽?zāi)苡心切傩?/p>
schema (DTD的升級(jí)版,語(yǔ)法更新一些,和DTD達(dá)到同等效果)
不可擴(kuò)展原因:DTD不可擴(kuò)展
關(guān)于XML文件的解析?
*無(wú)論是哪一種編程語(yǔ)言,對(duì)XML文件的解析都包括兩種方式:
*DOM解析
*SAX解析(org.xml.sax.helps DefaultHandler)
DOM解析
*原理
在開始解析XML文件的時(shí)候,將整個(gè)XMl文件全部加載到內(nèi)存中
在內(nèi)存中編程語(yǔ)言將XML文件映射成一顆DOM樹,這顆樹就是一個(gè)
對(duì)象,然后我們對(duì)這棵樹上的任意節(jié)點(diǎn)進(jìn)行增刪改查操作,由于
這棵樹全部都在內(nèi)存上,解析過(guò)去的節(jié)點(diǎn)可以再次解析,比較靈活。
*優(yōu)點(diǎn)
靈活,解析過(guò)去的節(jié)點(diǎn),可以再次解析
*缺點(diǎn)
如果XML文件比較大,可能會(huì)導(dǎo)致內(nèi)存溢出,即使不導(dǎo)致內(nèi)存溢出,
也會(huì)耗費(fèi)大量?jī)?nèi)存,內(nèi)存少了項(xiàng)目的運(yùn)行效率自然就降低了。
*什么情況下選擇dom解析方式
如果很靈活的操作每一個(gè)元素,選用dom解析,但是注意文件需要小一些
SAX解析
*原理
SAX解析是基于事件驅(qū)動(dòng)型的解析方式,他的解析不需要將整個(gè)XML文件全部
轉(zhuǎn)載到內(nèi)存中,解析的時(shí)候是有順序的,在XML文件中從上往下依次解析,遇
到開始標(biāo)簽,表示發(fā)生了一個(gè)特定的事件,此時(shí)執(zhí)行一段特定的程序,遇到結(jié)束
標(biāo)簽表示又發(fā)生一個(gè)特定事件,此時(shí)執(zhí)行一段特定的程序完成解析。
*優(yōu)點(diǎn)
不需要轉(zhuǎn)載XML文件,所以不會(huì)占用大量?jī)?nèi)存, 適合大文件
*缺點(diǎn)
解析過(guò)去的節(jié)點(diǎn)不能重復(fù)解析,除非重頭開始
*什么情況下選擇SAX解析方式
大文件適合使用SAX解析
作為程序員如何解析XML文件,解析XMl文件的開源項(xiàng)目都包括那些?
java解析XML相關(guān)的開源項(xiàng)目
*DOM4j(Dom for Java)
*JDOM
.....
JDK自帶一套,是實(shí)現(xiàn)W3C規(guī)范的
*org.w3c.com.*; 基于DOM解析
*org.xml.sax.*; 基于SAX解析
為了提高我們解析XMl文件的效率,還涉及到XPATH。(是一種標(biāo)簽匹配方式,類似于正則表達(dá)式,可以讓我們程序快速定位XML文件中的標(biāo)簽)
解析XML文件涉及到:
DOM4j/JDOM/W3C+......Xpath
JDK自帶的一套解析
首先在src目錄下創(chuàng)建一個(gè)xml文件
以下為解析過(guò)程
/** * 使用JDK自帶的"Dom解析"XML文件(讀) */ public class Text04 { public static void main(String[] args) throws Exception { //創(chuàng)建文檔解析器工廠對(duì)象 DocumentBuilderFactory factory= DocumentBuilderFactory.newInstance(); //創(chuàng)建文檔解析器對(duì)象 DocumentBuilder builder=factory.newDocumentBuilder(); //開始解析XML文件 String path=Thread.currentThread().getContextClassLoader().getResource("db-config.xml").toURI().getPath(); Document document =builder.parse(new File(path));//dom樹,在內(nèi)存中生成了一顆dom樹 //獲取根元素 Node rootNode=document.getFirstChild(); //獲取根元素的名字 System.out.println(rootNode.getNodeName()); //通過(guò)根元素獲取其他元素 Node driverNode=document.getElementsByTagName("driver").item(0); String driver =driverNode.getTextContent(); System.out.println(driver); } }
輸出結(jié)果
使用dom4j開源項(xiàng)目(基于dom解析)解析xml文件(讀)
需要將dom4j開源項(xiàng)目的jar包作為目錄導(dǎo)入
/** * 使用dom4j開源項(xiàng)目解析XML文件(讀) * * 讀XML文件 * * DOM4j * * 基于dom方式 */ public class Text01 { public static void main(String[] args) throws Exception { //創(chuàng)建解析器對(duì)象 SAXReader reader=new SAXReader();//雖然使用了SAXReader,但是還是基于DOM的解析方式 //獲取文檔對(duì)象,還是dom樹 String path=Thread.currentThread().getContextClassLoader().getResource("db-config.xml").toURI().getPath(); Document document= reader.read(new File(path)); //獲取根元素 Element rootElement=document.getRootElement(); //System.out.println(element.getName()); //獲取driver元素 Element driverElement =rootElement.element("driver"); //在獲取文本 String driver=driverElement.getText(); //System.out.println(driver); //直接獲取元素的文本內(nèi)容 driver=rootElement.elementText("driver"); System.out.println(driver); System.out.println(rootElement.elementText("url")); System.out.println(rootElement.elementText("user")); System.out.println(rootElement.elementText("password")); } }
輸出結(jié)果
使用dom4j開源項(xiàng)目(基于dom解析)解析xml文件(寫)
import org.dom4j.Document; import org.dom4j.DocumentHelper; import org.dom4j.Element; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import java.io.File; import java.io.FileWriter; /** * 使用dom4j開源項(xiàng)目解析XML文件(寫) */ public class Text02 { public static void main(String[] args) throws Exception { //創(chuàng)建文檔對(duì)象 Document document= DocumentHelper.createDocument(); //添加根元素 Element studentInfoElt=document.addElement("學(xué)生信息"); //給學(xué)生信息節(jié)點(diǎn)添加子節(jié)點(diǎn)學(xué)生節(jié)點(diǎn) Element studentElt=studentInfoElt.addElement("學(xué)生"); //給學(xué)生節(jié)點(diǎn)添加id屬性 studentElt.addAttribute("id","110"); //給學(xué)生節(jié)點(diǎn)添加名字字節(jié)點(diǎn) Element nameElt=studentElt.addElement("名字"); //設(shè)置名字節(jié)點(diǎn)文本 nameElt.setText("張三"); //給學(xué)生節(jié)點(diǎn)添加性別字節(jié)點(diǎn) Element sexElt=studentElt.addElement("性別"); //設(shè)置名字節(jié)點(diǎn)文本 sexElt.setText("男"); //開始寫 OutputFormat format= OutputFormat.createPrettyPrint(); format.setEncoding("utf-8"); String path="students.xml"; XMLWriter xmlWriter=new XMLWriter(new FileWriter(new File(path)),format); xmlWriter.write(document); xmlWriter.close(); } }
最終生成的xml文件
總結(jié)
本篇文章就到這里了,希望能給你帶來(lái)幫助,也希望你能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringBoot中優(yōu)化Undertow性能的方法總結(jié)
Undertow是一個(gè)采用 Java 開發(fā)的靈活的高性能Web服務(wù)器,提供包括阻塞和基于NIO的非堵塞機(jī)制,本文將給大家介紹SpringBoot中優(yōu)化Undertow性能的方法,文中有相關(guān)的代碼示例供大家參考,需要的朋友可以參考下2024-08-08IDEA MyBatis Plugins自動(dòng)生成實(shí)體類和mapper.xml
這篇文章主要介紹了IDEA MyBatis Plugins自動(dòng)生成實(shí)體類和mapper.xml,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07mybatis plus saveOrUpdate實(shí)現(xiàn)有重復(fù)數(shù)據(jù)就更新,否則新增方式
這篇文章主要介紹了mybatis plus saveOrUpdate實(shí)現(xiàn)有重復(fù)數(shù)據(jù)就更新,否則新增方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-12-12springboot使用Logback把日志輸出到控制臺(tái)或輸出到文件
這篇文章給大家介紹springboot項(xiàng)目使用日志工具Logback把日志不僅輸出到控制臺(tái),也可以輸出到文件的操作方法,本文通過(guò)實(shí)例圖文相結(jié)合給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-10-10Spring Boot 定制與優(yōu)化內(nèi)置的Tomcat容器實(shí)例詳解
本文主要記錄對(duì)內(nèi)置容器優(yōu)化和定制的方式,用于自己加深對(duì)SpringBoot理解。本文給大家介紹的非常詳細(xì),具有參考借鑒價(jià)值,需要的朋友參考下吧2017-12-12IDEA mybatis-generator逆向工程生成代碼
這篇文章主要介紹了IDEA mybatis-generator逆向工程生成代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-06-06Java 開發(fā)的幾個(gè)注意點(diǎn)總結(jié)
這篇文章主要介紹了Java開發(fā)的幾個(gè)注意點(diǎn)的相關(guān)資料,需要的朋友可以參考下2016-09-09