XML是一種可擴展的標記語言,可擴展就是<>內的東西可以自己定義,可以隨便寫。標記語言就是加了<>符號的 。HTML是超文本標記語言,不可以拓展,因為你寫個<p> 瀏覽器知道這個是段落,你寫個<shuyunquan>瀏覽器就不認識了,所以不可拓展
講講xml的書寫格式:
1.開頭固定
2.只能有一個根元素
3.沒了
<?xml version="1.0" encoding="UTF-8"?> <Students> <student> <name>許嵩</name> <age>32</age> </student> <student> <name>蜀雲泉</name> <age>23</age> </student> </Students>
我寫了一個,開頭的第一行是固定的,當然也可以多寫。這個是告訴別人,我是xml文件
下面來介紹一下Java是怎么操作xml的,也可以說是怎么操作DOM的,以前一直聽說DOM,Dom就是不知道是什么,原來DOM就是內存中的一個樹形結構的數據稱謂,xml的數據就是樹形結構的,在內存中就是DOM
這篇文章只是介紹一下,具體操作處理XML文件還是要使用Dom4j,看這篇文章
一、Java讀取xml
比如上面的xml文件,我想獲取第二個student元素的name里面的文本,操作如下:
private File f=new File("F:/Study Java/ch1helloworld/src/main/java/com/StadyJava/day2/xmldemo.xml"); public void testDocument() throws ParserConfigurationException, IOException, SAXException { //1. DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance(); //2. DocumentBuilder builder=factory.newDocumentBuilder(); //3 經過這3步獲取到了文檔 Document doc=builder.parse(f); //上面的三步可以寫成這樣 //Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f); //已經獲取了文檔對象,現在獲取xml的根元素 Element root=doc.getDocumentElement(); //獲取第二個student 因為返回的是父類型Node,所以需要強轉一下 Element student2=(Element) root.getElementsByTagName("student").item(1); //獲取第二個student元素的子元素name Element name2=(Element) student2.getElementsByTagName("name").item(0); //獲取name元素的文本內容 System.out.println(name2.getTextContent()); }
1.獲取xml文件
2.獲取根元素students
3.獲取根元素下面的第二個student元素
4.獲取第二個student元素的name元素
5.獲取name的文本內容
二、Java更改xml
這里我們准備把許嵩的年齡改為18
其實操作和上面的讀取差不多,只不過多了一個從內存更新到磁盤的步驟
public void setxml() throws Exception { //獲取文檔對象 Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f); //已經獲取了文檔對象,現在獲取xml的根元素 Element root=doc.getDocumentElement(); //獲取第一個student 因為返回的是父類型Node,所以需要強轉一下 Element student1=(Element) root.getElementsByTagName("student").item(0); //獲取第一個student元素的子元素age Element age1=(Element) student1.getElementsByTagName("age").item(0); //更新age元素的文本內容,這里僅僅的更新了內存中的DOM,還要更新到磁盤的xml源文件 age1.setTextContent("18"); //同步內存中的數據到磁盤中的源文件 Transformer trans=TransformerFactory.newInstance().newTransformer(); Source xmlSource=new DOMSource(doc); //內存中的DOM Result outputTarget=new StreamResult(f); //磁盤中的xml文件 trans.transform(xmlSource,outputTarget);//從內存更新到磁盤 }
三、Java插入xml數據
要插入新數據,要創建元素,要給元素賦值,要給元素之間綁定關系
public void Insertxml() throws Exception{ //獲取文檔對象 Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f); //已經獲取了文檔對象,現在獲取xml的根元素 Element root=doc.getDocumentElement(); //創建一個student元素以及子元素,注意,子元素和student之間還需要綁定 Element student=doc.createElement("student"); Element name=doc.createElement("name"); Element age=doc.createElement("age"); //給student元素賦值 name.setTextContent("林俊傑"); age.setTextContent("33"); //把子元素和student之間進行綁定 student.appendChild(name); student.appendChild(age); //把student元素和DOM的root根節點綁定起來 root.appendChild(student); //更新 Transformer trans=TransformerFactory.newInstance().newTransformer(); Source xmlSource=new DOMSource(doc); //內存中的DOM Result outputTarget=new StreamResult(f); //磁盤中的xml文件 trans.transform(xmlSource,outputTarget);//從內存更新到磁盤 }
就是這樣,代碼更改的就中間那一段。新增數據后是沒有空格格式的,所以數據都在一行,看起來不美觀
四、Java刪除xml元素
還是,先操作DOM,然后再更新到磁盤
public void deletexml() throws Exception { //獲取文檔對象 Document doc=DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(f); //已經獲取了文檔對象,現在獲取xml的根元素 Element root=doc.getDocumentElement(); //獲取要刪除的元素,記得強轉 Element student=(Element) root.getElementsByTagName("student").item(2); //刪除 root.removeChild(student); //同步操作 Transformer trans=TransformerFactory.newInstance().newTransformer(); Source xmlSource=new DOMSource(doc); //內存中的DOM Result outputTarget=new StreamResult(f); //磁盤中的xml文件 trans.transform(xmlSource,outputTarget);//從內存更新到磁盤 }
