使用JAXP對xml文件進行DOM解析基礎
XML解析方式分為兩種:dom和sax
dom:(Document Object Model, 即文件物件模型) 是 W3C 組織推薦的處理 XML 的一種方式。
sax: (Simple API for XML) 不是官方標準,但它是 XML 社群事實上的標準,幾乎所有的 XML 解析器都支援它。
XML解析器
Crimson、Xerces 、Aelfred2
XML解析開發包
Jaxp、Jdom、dom4j
JAXP 開發包是J2SE的一部分,它由javax.xml、org.w3c.dom 、org.xml.sax 包及其子包組成
在 javax.xml.parsers 包中,定義了幾個工廠類,程式設計師呼叫這些工廠類,可以得到對xml文件進行解析的 DOM 或 SAX 的解析器物件。
DOM模型(document object model)
DOM解析器在解析XML文件時,會把文件中的所有元素,按照其出現的層次關係,解析成一個個Node物件(節點)。
在dom中,節點之間關係如下:
位於一個節點之上的節點是該節點的父節點(parent)
一個節點之下的節點是該節點的子節點(children)
同一層次,具有相同父節點的節點是兄弟節點(sibling)
一個節點的下一個層次的節點集合是節點後代(descendant)
父、祖父節點及所有位於節點上面的,都是節點的祖先(ancestor)
javax.xml.parsers 包中的DocumentBuilderFactory用於建立DOM模式的解析器物件 ,
DocumentBuilderFactory是一個抽象工廠類,它不能直接例項化,
但該類提供了一個newInstance方法 ,這個方法會根據本地平臺預設安裝的解析器,自動建立一個工廠的物件並返回。
1.呼叫 DocumentBuilderFactory.newInstance() 方法得到建立 DOM 解析器的工廠物件。
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
2.呼叫工廠物件的 newDocumentBuilder方法得到 DOM 解析器物件。
DocumentBuilder builder = factory.newDocumentBuilder();
3.呼叫 DOM 解析器物件的 parse() 方法解析 XML 文件,得到代表整個文件的 Document 物件,進行可以利用DOM特性對整個XML文件進行操作了。
DocumentBuilder builder = factory.newDocumentBuilder();
Node物件提供了一系列常量來代表結點的型別,當開發人員獲得某個Node型別後,就可以把Node節點轉換成相應的節點物件(Node的子類物件),以便於呼叫其特有的方法。(檢視API文件)
Node物件提供了相應的方法去獲得它的父結點或子結點。程式設計人員透過這些方法就可以讀取整個XML文件的內容、或新增、修改、刪除XML文件的內容了。(如果Node物件沒有對應的方法可以強制轉換為Element等物件進行操作)
javax.xml.transform包中的Transformer類用於把代表XML檔案的Document物件轉換為某種格式後進行輸出,例如把xml檔案應用樣式表後轉成一個html文件。利用這個物件,當然也可以把Document物件又重新寫入到一個XML檔案中。
-
Transformer類透過transform方法完成轉換操作,該方法接收一個源和一個目的地。我們可以透過:
transform(Source xmlSource, Result outputTarget)
javax.xml.transform.dom.DOMSource類來關聯要轉換的document物件,
用javax.xml.transform.stream.StreamResult 物件來表示資料的目的地。
Transformer物件透過TransformerFactory獲得。
book1.xml:
<?xml version="1.0" encoding="utf-8" standalone="no"?><書架> <書 name="xxxx"> <售價>55元</售價> <書名>Java就業培訓教程</書名> <作者>張孝祥</作者> </書> <書> <書名>JavaScript網頁開發</書名> <作者>張孝祥</作者> <售價>28.00元</售價> </書></書架>
Demo1.java:
package wys.jaxp;import java.io.File;import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; 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.Node; import org.w3c.dom.NodeList;public class Demo1 { public static void main(String[] args) throws Exception { // 獲取工廠 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // 產生解析器 DocumentBuilder builder = factory.newDocumentBuilder(); // 解析xml文件,獲取代表文件的document Document document = builder.parse(new File("src/xml/book1.xml")); read(document); } // 讀取指定節點值 public static void read(Document document) { NodeList nodelist = document.getElementsByTagName("售價"); Node node = nodelist.item(0); String val = node.getTextContent(); System.out.println(val); } // 更新節點內容 public static void update() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("src/xml/book1.xml")); // 獲取售價節點 Node price = document.getElementsByTagName("售價").item(0); price.setTextContent("5555元"); TransformerFactory tfactory = TransformerFactory.newInstance(); Transformer tformer = tfactory.newTransformer(); tformer.transform(new DOMSource(document), new StreamResult(new File( "src/xml/book1.xml"))); } // 向指定節點中增加子節點 public static void add() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("src/xml/book1.xml")); // 建立一個售價節點在記憶體中 Node price = document.createElement("售價"); price.setTextContent("1888元"); // 獲取要加入位置的父節點 Node shu = document.getElementsByTagName("書").item(0); // 把需要增加的節點掛到父節點上 shu.appendChild(price); // 將記憶體中的document寫入xml檔案,先用轉換工廠得到轉換器 TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult( new File("src/xml/book1.xml"))); } //向指定位置插入新的節點 @Test public void add2() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("src/xml/book1.xml")); Node price = document.createElement("售價"); price.setTextContent("指定位置:16元"); // 向指定節點之前插入新節點 Node shu = document.getElementsByTagName("書").item(0); shu.insertBefore(price, document.getElementsByTagName("書名").item(0)); // 將記憶體中的document寫入xml檔案,先用轉換工廠得到轉換器 TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult( new File("src/xml/book1.xml"))); } @Test //刪除指定節點 public void delete() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("src/xml/book1.xml")); // 獲取要刪除的節點,呼叫父節點刪除(自己不能刪除自己) Node price = document.getElementsByTagName("售價").item(2); price.getParentNode().removeChild(price); TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult( new File("src/xml/book1.xml"))); } // 操作xml文件屬性 @Test public void updateAttribute() throws Exception { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); DocumentBuilder builder = factory.newDocumentBuilder(); Document document = builder.parse(new File("src/xml/book1.xml")); // Element繼承自Node,Node沒有操作屬性的方法,操作節點屬性需要強制轉換為元素節點 Element shu = (Element) document.getElementsByTagName("書").item(0); shu.setAttribute("name", "yyyyyyy"); shu.setAttribute("password", "12345678"); shu.removeAttribute("password"); TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); transformer.transform(new DOMSource(document), new StreamResult( new File("src/xml/book1.xml"))); } }
作者:
原文連結:https://www.cnblogs.com/wys201161/p/10506280.html
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/2459/viewspace-2822204/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 使用jaxp解析器dom方式對xml節點進行操作XML
- 使用JAXP進行DOM解析_SAX解析
- 使用JAXP進行DOM解析( DocumentBuilderFactory、DocumentBuilder、Document)UI
- Java中Dom解析xml文件JavaXML
- DOM解析XMLXML
- 使用JAXP進行SAX解析(XMLReaderFactory、XMLReader 、SAXParserFactory與SAXParser)XML
- 利用JAXP解析xml中遇到的問題XML
- xml解析之domXML
- 基於 DOM 的 XML 檔案解析類XML
- 使用dom4j 解析, 操作XMLXML
- 使用Dom4j解析XML案例XML
- Python解析xml[xml.dom]PythonXML
- JAVA進行XML解析JavaXML
- 使用PHP DOM-XML建立和解析XML檔案 (轉)PHPXML
- xml.dom——文件物件模型APIXML物件模型API
- 使用XPathExpression類對XML進行排序 (轉)ExpressXML排序
- Python XML解析之DOMPythonXML
- XML DOM 解析器概述XML
- dom4j解析xmlXML
- XML 檔案解析實踐 (DOM 解析)XML
- 使用Digester解析XML文件示例 (轉)XML
- Mybatis 基礎xml對映MyBatisXML
- [轉]使用 SAX 處理 XML 文件 和與DOM的區別XML
- XML DOM 解析器錯誤概述XML
- Dom4j解析XML資料XML
- Android系列--DOM、SAX、Pull解析XMLAndroidXML
- python 解析xml 檔案: DOM 方式PythonXML
- c#(解析xml檔案基礎方法)C#XML
- 使用acorn對JavaScript程式碼進行解析。JavaScript
- jaxp的sax解析操作
- Java解析XML彙總(DOM/SAX/JDOM/DOM4j/XPath)JavaXML
- XML解析的兩種方式DOM和SAXXML
- 如何使用Python對引數進行解析Python
- Asp.net 對一下XML文件進行新增刪改的例項ASP.NETXML
- javascript基礎(DOM物件概述,事件,文件載入)(二十五)JavaScript物件事件
- XML基礎XML
- 使用 Racket 進行基礎影像識別Racket
- 使用 OCaml 進行基礎影像識別