Download presentation
Presentation is loading. Please wait.
1
單元3-1: DOM簡介(Part-I) 王豐緒 銘傳大學資工系
2
單元目標 了解XML DOM 了解DOM API的種類 熟悉JAVA DOM API的運用 產生空白的XML文件 新增XML文件節點
3
XML文件結構樹 (XML DOM) 文件實體 (document entity) 前言 只能有一個! 文件元素 (document
element) 元素子樹 (element subtree) 結語
4
文件元素樹 文件元素 (document element) 子元素 屬性 (element) (attributes) 子元素 (sub-
文字字元 (characters) 處理指令 (PI) CDATA字元 (CDATA) 註解 (comments)
5
何謂DOM DOM的全名是「Document Object Model」
定義一個應用程式介面(API:Application Program Interface)讓程式設計師可以管理、存取文件裡的內容 應用程式可以透過這些API間接做到它想做的事
6
XML DOM API 的應用 XML 文件 XML DOM parser (文字檔) DOM Tree (存在記憶體) XML
application
7
常見的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) ( 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
8
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
9
DOM 節點的階層性 Document Entity Node NodeList
10
動作1:產生XML文件 從無到有產生XML文件意味著產生XML文件的根元素
<?xml version = "1/0" encoding="UTF-8" ?> <行事曆 /> / Document Entity Node 行事曆 Document Element Node
11
如何產生新的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); //會自行將根元素插入到文件實體節點的下面
12
查一下?動一下? 查一下下列物件所在的package 上一頁的投影片在執行上要注意try-catch的錯誤處理
DocumentBuilderFactory DocumentBuilder DOMImplementation Document Element 查到的套件需要用import匯入java程式 上一頁的投影片在執行上要注意try-catch的錯誤處理 請寫一個Java程式,看看要catch哪些錯誤?
13
動動手 查一下下列物件所在的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範例
14
相關XML DOM類別 DocumentBuilderFactory類別 DocumentBuilder類別 Document類別
在產生DocumentBuilder之前,可以先設定DocumentBuilder的屬性 setNamespaceAware(true|false) setValidation(true|false) DocumentBuilder類別 可以用來產生Document物件 透過newDocument() 透過產生DomImplementation,再叫用其createDocument()方法 Document類別 可以用來產生XML文件的節點(元素, 屬性等): 例如createElement() 可以用來插入根元素到文件實體之下: appendChild()方法
15
動作2:產生具有命名空間的XML文件 從無到有產生XML文件意味著產生XML文件具有命名空間的根元素
<?xml version = "1/0" encoding="UTF-8" ?> <mcu:行事曆 xmlns:mcu=" xmlns:mcu =" / Document Entity Node mcu:行事曆 Document Element Node
16
如何產生新的具備命名空間的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(" //root就是XML文件根元素 doc.appendChild (root) ; //需要自行將根元素插入到文件實體節點的下面 // 方法二:利用DOMImplementation物件的createDocument()方法 DOMImplementation impl = builder.getDOMImplementation(); Document doc = impl.createDocument( " "mcu:行事曆", null); //會自行將根元素插入到文件實體節點的下面
17
動作2:程式範例 JAVA範例
18
相關XML DOM類別 DomImplementation類別 Document類別 可以用來產生Document物件
透過createDocument(“URI”, qualified_name, null)方法 Document類別 可以用來產生XML文件的節點(元素, 屬性等) 透過createElementNS(“URI”, qualified_name)
19
動作3:如何取得XML根元素 //利用 Document 物件 Document doc = ….
Element rootElement = doc.getDocumentElement(); doc rootEleemnt / Document Entity Node 行事曆 Document Element Node
20
動作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
21
動作5:設定XML元素節點的屬性(具有命名空間)
//利用 Element物件 Document doc = …. Element root = doc.getDocumentElement(); //設定date屬性值為 "2009/03/24" root.setAttributeNS(" "mcu:date", " 2009/03/24 "); doc root / Document Entity Node mcu:date= "2009/03/24" 行事曆 Document Element Node
22
動作6:新增XML文件節點 插入一個XML文件的元素節點(有時包含屬性節點)
<?xml version = "1/0" encoding="UTF-8" ?> <行事曆> <年 年份="2009" /> </行事曆>
23
如何新增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
24
動作6:程式範例 程式範例
25
動作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);
26
動作7:程式範例 程式範例
27
動作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);
28
查一下?動一下? 查一下下列物件所在的package 上一頁的投影片在執行上要注意try-catch的錯誤處理
TransformerFactory Transformer Source, DOMSource Result, StreamResult, FileOutputStream 查到的套件需要用import匯入java程式 上一頁的投影片在執行上要注意try-catch的錯誤處理 請寫一個Java程式,看看要catch哪些錯誤?
29
動作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範例
30
動作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) );
31
動作9:程式範例 程式範例
32
單元複習 XML DOM DOM API的種類 各種基本的JAVA DOM API的運用 產生空白的XML文件 新增XML文件節點
命名空間的處理 儲存與載入XML文件
33
練習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()可以控制新節點擺放的位置
34
練習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>
Similar presentations