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 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
›
›
›
›
›
›
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 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); //會自行將
根元素插入到文件實體節點的下面
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>