dom解析方式對xml文件進行操作
阿新 • • 發佈:2019-01-06
<span style="font-size:14px;"><?xml version="1.0" encoding="utf-8" standalone="no"?><書架> <書> <書名 name="xxx">java就業培訓教程</書名> <作者>張孝祥</作者> <售價>36.2元</售價> </書> <書> <書名>javascript就業培訓教程</書名> <作者>張孝祥</作者> <售價>36.2元</售價> </書> </書架></span>
<span style="font-size:14px;">package com.rj.xml; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; import org.junit.Test; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import org.xml.sax.SAXException; //使用dom方式對xml文件進行crud public class Demo01 { //讀取xml文件中: <書名>javascript就業培訓教程</書名> 節點的值 @Test public void read1() throws Exception{ //1.建立工廠 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //2.得到dom解析器 DocumentBuilder builder = factory.newDocumentBuilder(); //解析xml文件,得到代表文件的document物件 Document document = builder.parse("src/book.xml"); NodeList nodeList = document.getElementsByTagName("書名");//通過書名,查詢所有書名的節點,即元素 Node node = nodeList.item(1); //返回集合中的第 index 個項。 String content = node.getTextContent();//返回節點中內容 System.out.println(content); } /* * dom解析下,xml文件的每一個組成部分都會用一個物件表示,例如標籤用Element,屬性用Attr, * 但不管什麼物件,都是Node的子類,所以在開發中可以把獲取到的任意結點都當作Node對待. * */ //得到xml中的所有標籤 @Test public void read2() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); //得到根節點 NodeList nodeList = document.getElementsByTagName("書架"); Node root = nodeList.item(0); //或者直接 document.getElementsByTagName("書架").item(0); list(root);//遞迴過去所有節點 } private void list(Node node) { if(node instanceof Element){ System.out.println(node.getNodeName()); } NodeList list = node.getChildNodes();//獲取此結點下一層的所有結點,包括空格 // System.out.println(list.getLength()); for(int i=0;i<list.getLength();i++){ Node child = list.item(i); list(child); } } //得到xml中文件屬性的值: <書名 name="xxx">java就業培訓教程</書名> @Test public void read3() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); /* Node node = document.getElementsByTagName("書名").item(0); NamedNodeMap namedNodeMap = node.getAttributes(); System.out.println(namedNodeMap.getNamedItem("name").getTextContent()); 當NamedNodeMap有多個的時候遍歷比較麻煩,因此從他的子類Element這個類中找方法直接獲取值 */ Element bookname = (Element) document.getElementsByTagName("書名").item(0); String value = bookname.getAttribute("name"); System.out.println(value); } //向xml中新增節點:第一本書中新增 <售價>50.0元</售價> @Test public void add01() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); /* * 插入這個資料,先獲取他的上一層的節點,利用他的節點,插入 * 建立節點時候,先建立再填充內容 * */ //建立節點 Element price = document.createElement("售價"); price.setTextContent("50.0元"); //把建立的節點掛到第一本書上 Element book = (Element) document.getElementsByTagName("書").item(0); book.appendChild(price); /* * 更新xml文件 * javax.xml.transform包中的Tranformer類用於把代表XML檔案的Document物件轉換為某種格式後進行輸出 * 例如:把xml檔案應用樣式表後轉成一個html文件,利用這個物件,當然也可以把Document物件由重新寫入一個XML檔案中。 * * Tranformer類通過transform方法完成轉化操作,該方法接收一個源和一個目的地. * 我們可以通過: * javax.xml.transform.dom.DOMSource類來關聯要轉換的document物件 * 用javax.xml.transform.stream.StreamResult物件來表示資料的目的地 * * Tranformer物件通過TransformFactory獲得 * * */ /* * Transformer獲取,用工廠類TransformerFactory中的靜態方法-- * static TransformerFactory newInstance() 獲取 TransformerFactory 的新例項。 TransformerFactory中的方法:得到Transformer物件 abstract Transformer newTransformer() 建立執行從 Source 到 Result 的複製的新 Transformer。 * Transformer抽象類裡面有這樣一個方法 * abstract void transform(Source xmlSource, Result outputTarget) * 將 XML Source 轉換為 Result。 * * 怎麼通過Source的物件獲取document物件-->Source的介面實現類DOMSource的構造方法 * DOMSource(Node n) 建立帶有 DOM 節點的新輸入源。 * * Result的介面實現類StreamResult中的構造方法: * StreamResult(OutputStream outputStream) 從位元組流構造 StreamResult。 * */ //更新後記憶體寫回到xml文件中 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document),new StreamResult(new FileOutputStream("src/book.xml"))) ; } //在指定位置插入元素 <售價>36.2元</售價>節點之前 @Test public void add02() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); //建立節點 Element price = document.createElement("售價"); price.setTextContent("59.9元"); //得到參考節點 Element refNode = (Element) document.getElementsByTagName("售價").item(0); //得到要掛崽的節點,即參考節點的上一層的節點 Element book = (Element) document.getElementsByTagName("書").item(0); //往book的指定位置插崽,即插入參考節點 book.insertBefore(price,refNode); //更新xml TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } //向xml文件中新增屬性: <書名>java就業培訓教程</書名>--> name="xxx" @Test public void addAttr() throws Exception{ DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = documentBuilderFactory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); Element bookname = (Element) document.getElementsByTagName("書名").item(0); bookname.setAttribute("name", "xxx"); TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } //刪除第一個書名節點的售價:<售價>36.2元</售價> @Test public void delete1() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); //得到要刪除的節點 Element e = (Element) document.getElementsByTagName("售價").item(0); //得到要刪除節點的爸爸 Element book = (Element) document.getElementsByTagName("書").item(0); //爸爸想刪除 book.removeChild(e); //更新結果集 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } //刪除 <售價>36.2元</售價>的父親節點 @Test public void delete2() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); //得到要刪除的節點 //e.getParentNode()-->獲取此節點的父親節點 Element e = (Element) document.getElementsByTagName("售價").item(0); e.getParentNode().getParentNode().removeChild(e.getParentNode()); //刪除所有節點 //記住根節點的爸爸是document //e.getParentNode().getParentNode().getParentNode().removeChild(e.getParentNode().getParentNode()); //更新結果集 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } //跟新售價 <售價>36.2元</售價>-->100元 @Test public void update() throws Exception{ DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse("src/book.xml"); Element e = (Element) document.getElementsByTagName("售價").item(0); e.setTextContent("100元"); //更新結果集 TransformerFactory transformerFactory = TransformerFactory.newInstance(); Transformer transformer = transformerFactory.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult(new FileOutputStream("src/book.xml"))); } } </span>