Transcript Document

了解XML DOM
 了解DOM API的種類
 熟悉JAVA DOM API的運用

› 產生空白的XML文件
› 新增XML文件節點
› 儲存與載入XML文件
文件實體
(document
entity)
前言
只能有一個!
文件元素
(document
element)
元素子樹
(element
subtree)
結語
文件元素
(document
element)
子元素
(element)
屬性
(attributes)
子元素
(subelement)
處理指令
(PI)
註解
(comments)
文字字元
(characters)
CDATA字元
(CDATA)

DOM的全名是「Document Object Model」
› 定義一個應用程式介面(API:Application Program
Interface)讓程式設計師可以管理、存取文件裡的內
容
› 應用程式可以透過這些API間接做到它想做的事
XML 文件
(文字檔)
XML DOM
parser
DOM Tree
(存在記憶體)
XML
DOM API
application

JAXP
› 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

Node
› A node in an XML document

Document

NodeList

Element

Attr

CharacterData

Text

Comment

ProcessingInstruction

CDATASection
Node
› XML document’s top-level node
Document
› A read-only list of Node objects
Element
› An element node
› An attribute node
› Represent character data
Attr
CharacterData
Text
› A text node
›
A comment node
›
A PI node
›
A CDATA node
CDATASection
Comment
ProcessingInstruction
Document Entity
Node
NodeList

從無到有產生XML文件意味著產生XML文件
的根元素
<?xml version = "1/0" encoding="UTF-8" ?>
<行事曆 />
Document Entity
Node
/
行事曆
Document Element
Node
// 如何產生Document 物件?
//利用 DocumentBuilder 物件
// 方法一: DocumentBuilderFactory DocumentBuilderDocument
// 方法二: DocumentBuilderFactoryDocumentBuilderDOMImplementationDocument
//共同的部分:建立 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
›
›
›
›
›
›

DocumentBuilderFactory
DocumentBuilder
DOMImplementation
Document
Element
查到的套件需要用import匯入java程式
上一頁的投影片在執行上要注意try-catch的
錯誤處理
› 請寫一個Java程式,看看要catch哪些錯誤?

查一下下列物件所在的package
› DocumentBuilderFactory
 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範例

DocumentBuilderFactory類別
› 可以用來產生DocumentBuilder物件
› 在產生DocumentBuilder之前,可以先設定DocumentBuilder
的屬性
 setNamespaceAware(true|false)
 setValidation(true|false)

DocumentBuilder類別

Document類別
› 可以用來產生Document物件
 透過newDocument()
 透過產生DomImplementation,再叫用其createDocument()方
法
› 可以用來產生XML文件的節點(元素, 屬性等): 例如
createElement()
› 可以用來插入根元素到文件實體之下: appendChild()方法

從無到有產生XML文件意味著產生XML文件
具有命名空間的根元素
<?xml version = "1/0" encoding="UTF-8" ?>
<mcu:行事曆 xmlns:mcu="http://www.mcu.edu.tw"/>
Document Entity
Node
xmlns:mcu
="http://www.mcu.edu.tw"
/
mcu:
行事曆
Document Element
Node
// 如何產生Document 物件?
//利用 DocumentBuilder 物件
// 方法一: DocumentBuilderFactory DocumentBuilderDocument
// 方法二: DocumentBuilderFactoryDocumentBuilderDOMImplementationDocument
//共同的部分:建立 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); //會自行將
根元素插入到文件實體節點的下面

JAVA範例

DomImplementation類別
› 可以用來產生Document物件
 透過createDocument(“URI”, qualified_name,
null)方法

Document類別
› 可以用來產生XML文件的節點(元素, 屬性等)
 透過createElementNS(“URI”, qualified_name)
//利用 Document 物件
Document doc = ….
Element rootElement = doc.getDocumentElement();
doc
rootEleemnt
Document Entity
Node
/
行事曆
Document Element
Node
//利用 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
//利用 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

插入一個XML文件的元素節點(有時包含屬性
節點)
<?xml version = "1/0" encoding="UTF-8" ?>
<行事曆>
<年 年份="2009" />
</行事曆>
//利用 Element物件
Document doc = …. //假設用前面的範例已經產生XML document物件
Element root = doc.getDocumentElement();
//產生新的元素節點
Element elem= doc.createElement("年");
elem.setAttribute("年份", "2009"); //設定屬性
//利用appendChild()將新節點插入適當的位置
root.appendChild(elem);
doc
/
行事曆
root
年
elem
年份
="2009"
Attribute
Node

程式範例
//利用 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);

程式範例
//利用 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
› TransformerFactory
› Transformer
› Source, DOMSource
› Result, StreamResult, FileOutputStream
› 查到的套件需要用import匯入java程式

上一頁的投影片在執行上要注意try-catch的
錯誤處理
› 請寫一個Java程式,看看要catch哪些錯誤?

查一下下列物件所在的package
› TransformerFactory
 javax.xml.transform
› Transformer
 javax.xml.transform
› Source
 javax.xml.transform
› DOMSource
 javax.xml.transform.dom
› Result
 javax.xml.transform
› StreamResult
 javax.xml.transform.stream
› , FileOutputStream
 Java.io

JAVA範例
//利用 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) );

程式範例
XML DOM
 DOM API的種類
 各種基本的JAVA DOM API的運用

› 產生空白的XML文件
› 新增XML文件節點
› 命名空間的處理
› 儲存與載入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()可以控制新節點擺放的位置

寫一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>