單元3-1: DOM簡介(Part-I) 王豐緒 銘傳大學資工系
單元目標 了解XML DOM 了解DOM API的種類 熟悉JAVA DOM API的運用 產生空白的XML文件 新增XML文件節點
XML文件結構樹 (XML DOM) 文件實體 (document entity) 前言 只能有一個! 文件元素 (document element) 元素子樹 (element subtree) 結語
文件元素樹 文件元素 (document element) 子元素 屬性 (element) (attributes) 子元素 (sub- 文字字元 (characters) 處理指令 (PI) CDATA字元 (CDATA) 註解 (comments)
何謂DOM DOM的全名是「Document Object Model」 定義一個應用程式介面(API:Application Program Interface)讓程式設計師可以管理、存取文件裡的內容 應用程式可以透過這些API間接做到它想做的事
XML DOM API 的應用 XML 文件 XML DOM parser (文字檔) DOM Tree (存在記憶體) XML application
常見的DOM-based Parsers JAXP XML4J Xerces Msxml 4DOM XML::DOM Sun Microsystem’s JAVA API for XML Parsing (JAXP) (java.sun.com/xml) XML4J IBM’s XML Parser for Java (XML4J) (www.alphaworks.ibm.com/tech/xml4j) Xerces Apache’s Xerces Java Parser (xml.apache.org/xerces) Msxml Microsoft’s XML Parser (msxml) 4DOM XML parser for the Python programming language XML::DOM XML parser for the Perl programming language
ProcessingInstruction 常見Java XML DOM 類別 Node A node in an XML document Document XML document’s top-level node NodeList A read-only list of Node objects Element An element node Attr An attribute node CharacterData Represent character data Text A text node Comment A comment node ProcessingInstruction A PI node CDATASection A CDATA node Node Document Element Attr CharacterData Text CDATASection Comment ProcessingInstruction
DOM 節點的階層性 Document Entity Node NodeList
動作1:產生XML文件 從無到有產生XML文件意味著產生XML文件的根元素 <?xml version = "1/0" encoding="UTF-8" ?> <行事曆 /> / Document Entity Node 行事曆 Document Element Node
如何產生新的XML文件 // 如何產生Document 物件? //利用 DocumentBuilder 物件 // 方法一: DocumentBuilderFactory DocumentBuilderDocument // 方法二: DocumentBuilderFactoryDocumentBuilderDOMImplementationDocument //共同的部分:建立 DocumentBuilder物件 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //factory.setNamespaceAware(true); //設定處理Namespace // factory.setValidating(true); // //設定剖析XML文件時,進行驗證 //取得DocumentBuilder物件 DocumentBuilder builder = factory.newDocumentBuilder(); // 方法一: 利用DocumentBuilder物件的newDocument()方法 Document doc = builder.newDocument(); //doc就是XML文件實體節點 Element root = doc.createElement ("行事曆"); //root就是XML文件根元素 doc.appendChild (root) ; //需要自行將根元素插入到文件實體節點的下面 // 方法二:利用DOMImplementation物件的createDocument()方法 DOMImplementation impl = builder.getDOMImplementation(); Document doc = impl.createDocument( "", "行事曆", null); //會自行將根元素插入到文件實體節點的下面
查一下?動一下? 查一下下列物件所在的package 上一頁的投影片在執行上要注意try-catch的錯誤處理 DocumentBuilderFactory DocumentBuilder DOMImplementation Document Element 查到的套件需要用import匯入java程式 上一頁的投影片在執行上要注意try-catch的錯誤處理 請寫一個Java程式,看看要catch哪些錯誤?
動動手 查一下下列物件所在的package JAVA範例 DocumentBuilderFactory DocumentBuilder javax.xml.parsers.DocumentBuilderFactory DocumentBuilder javax.xml.parsers.DocumentBuilder DOMImplementation org.w3c.dom.DOMImplementation Document org.w3c.dom.Document Element org.w3c.dom.Element JAVA範例
相關XML DOM類別 DocumentBuilderFactory類別 DocumentBuilder類別 Document類別 在產生DocumentBuilder之前,可以先設定DocumentBuilder的屬性 setNamespaceAware(true|false) setValidation(true|false) DocumentBuilder類別 可以用來產生Document物件 透過newDocument() 透過產生DomImplementation,再叫用其createDocument()方法 Document類別 可以用來產生XML文件的節點(元素, 屬性等): 例如createElement() 可以用來插入根元素到文件實體之下: appendChild()方法
動作2:產生具有命名空間的XML文件 從無到有產生XML文件意味著產生XML文件具有命名空間的根元素 <?xml version = "1/0" encoding="UTF-8" ?> <mcu:行事曆 xmlns:mcu="http://www.mcu.edu.tw"/> xmlns:mcu ="http://www.mcu.edu.tw" / Document Entity Node mcu:行事曆 Document Element Node
如何產生新的具備命名空間的XML文件 // 如何產生Document 物件? //利用 DocumentBuilder 物件 // 方法一: DocumentBuilderFactory DocumentBuilderDocument // 方法二: DocumentBuilderFactoryDocumentBuilderDOMImplementationDocument //共同的部分:建立 DocumentBuilder物件 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); //factory.setNamespaceAware(true); //設定處理Namespace // factory.setValidating(true); // //設定剖析XML文件時,進行驗證 //取得DocumentBuilder物件 DocumentBuilder builder = factory.newDocumentBuilder(); // 方法一: 利用DocumentBuilder物件的newDocument()方法 Document doc = builder.newDocument(); //doc就是XML文件實體節點 Element root = doc.createElementNS("http://www.mcu.edu.tw","mcu:行事曆"); //root就是XML文件根元素 doc.appendChild (root) ; //需要自行將根元素插入到文件實體節點的下面 // 方法二:利用DOMImplementation物件的createDocument()方法 DOMImplementation impl = builder.getDOMImplementation(); Document doc = impl.createDocument( "http://www.mcu.edu.tw", "mcu:行事曆", null); //會自行將根元素插入到文件實體節點的下面
動作2:程式範例 JAVA範例
相關XML DOM類別 DomImplementation類別 Document類別 可以用來產生Document物件 透過createDocument(“URI”, qualified_name, null)方法 Document類別 可以用來產生XML文件的節點(元素, 屬性等) 透過createElementNS(“URI”, qualified_name)
動作3:如何取得XML根元素 //利用 Document 物件 Document doc = …. Element rootElement = doc.getDocumentElement(); doc rootEleemnt / Document Entity Node 行事曆 Document Element Node
動作4:設定XML元素節點的屬性 //利用 Element物件 Document doc = …. Element root = doc.getDocumentElement(); //設定date屬性值為 "2009/03/24" root.setAttribute("date", " 2009/03/24 "); doc root / Document Entity Node date= "2009/03/24" 行事曆 Document Element Node
動作5:設定XML元素節點的屬性(具有命名空間) //利用 Element物件 Document doc = …. Element root = doc.getDocumentElement(); //設定date屬性值為 "2009/03/24" root.setAttributeNS("http://www.mcu.edu.tw", "mcu:date", " 2009/03/24 "); doc root / Document Entity Node mcu:date= "2009/03/24" 行事曆 Document Element Node
動作6:新增XML文件節點 插入一個XML文件的元素節點(有時包含屬性節點) <?xml version = "1/0" encoding="UTF-8" ?> <行事曆> <年 年份="2009" /> </行事曆>
如何新增XML文件內容節點 //利用 Element物件 Document doc = …. //假設用前面的範例已經產生XML document物件 Element root = doc.getDocumentElement(); //產生新的元素節點 Element elem= doc.createElement("年"); elem.setAttribute("年份", "2009"); //設定屬性 //利用appendChild()將新節點插入適當的位置 root.appendChild(elem); / doc 行事曆 root 年份="2009" 年 Attribute Node elem
動作6:程式範例 程式範例
動作7:如何新增各式XML內容節點 //利用 Element物件 Document doc = …. Element root = doc.getDocumentElement(); //產生各式的節點 Element elem= doc.createElement(“年"); elem.setAttribute("年份", "2009"); //設定屬性 Comment comment = doc.createComment(“註解內容"); Text txt= doc.createTextNode(“文字內容"); ProcessingInstruction pi = doc.createProcessingInstruction(“target”, “data”); CDATASection cdata = doc.createCDATASection(“cdata”); //利用appendChild()將新節點插入適當的位置 root.appendChild(elem); root.appendChild(comment); root.appendChild(txt); root.appendChild(pi); root.appendChild(cdata);
動作7:程式範例 程式範例
動作8:如何儲存XML檔案 //利用 Transformer物件 // TransformerFactory Transformer TransformerFactory tranFactory = TransformerFactory.newInstance(); Transformer aTransformer = tranFactory.newTransformer(); //準備進行存檔成為檔名 filename Document doc = …. Source src = new DOMSource(doc); Result dest = new StreamResult(new FileOutputStream(filename)); //呼叫transform分法, 進行存檔 aTransformer.transform(src, dest);
查一下?動一下? 查一下下列物件所在的package 上一頁的投影片在執行上要注意try-catch的錯誤處理 TransformerFactory Transformer Source, DOMSource Result, StreamResult, FileOutputStream 查到的套件需要用import匯入java程式 上一頁的投影片在執行上要注意try-catch的錯誤處理 請寫一個Java程式,看看要catch哪些錯誤?
動作8:程式範例 查一下下列物件所在的package JAVA範例 Transformer Source DOMSource TransformerFactory javax.xml.transform Transformer Source DOMSource javax.xml.transform.dom Result StreamResult javax.xml.transform.stream , FileOutputStream Java.io JAVA範例
動作9:如何載入XML檔案 //利用 DocumentBuilder物件 的parse方法 //產生DocumentBuilder物件 DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance(); dfactory.setNamespaceAware(true); //啟動namespace處理機制 dfactory.setValidating(true); //啟動validating處理機制 DocumentBuilder blder = dfactory.newDocumentBuilder() ; //載入XML文件 Document doc = blder.parse(new File (filename) );
動作9:程式範例 程式範例
單元複習 XML DOM DOM API的種類 各種基本的JAVA DOM API的運用 產生空白的XML文件 新增XML文件節點 命名空間的處理 儲存與載入XML文件
練習1:XML文件的新增與儲存 寫一JAVA程式,產生下列的XML文件,並存成test.xml <!-- this document is my first XML document --> <myDoc> <event date =“2009/03/24”> Today I learn to create an XML document! </event> </myDoc>c 注意: 使用Node介面的insertBefore()可以控制新節點擺放的位置
練習2:XML文件的載入 寫一JAVA程式,將上頁產生的XML文件載入,修改成下列的樣子後存成test2.xml <!-- this document is my first XML document --> <myDoc> <event date =“2009/03/24”> Today I learn to create XML document! Now, I learn to load an XML document! </event> </myDoc>