投影片 - 銘傳大學

Report

熟悉JAVA DOM API的運用
› 修改XML文件內容
› 進階屬性節點的操作
› 驗證(Validate) XML 文件
› 遊走XML DOM Tree

修改XML文件的元素節點的文字內容
<?xml version = "1/0" encoding="UTF-8" ?>
<行事曆>
<年 年份=“2009” >中華民國97年</年>  <年 年份=“2009” >中華民國98年</年>
</行事曆>
/
行事曆
年
年份
="2009"
中華民國97年
中華民國98年
//先載入XML文件
Document doc = … ;
// 找到要修改的節點, 目前先用簡單的元素定址功能 getElementsByTagName()
Element root = doc.getDocumentElement() ;
NodeList targets = root.getElementsByTagName(“年”) ;
if (targets.getLength() != 0) {
Node target_node = targets.item( 0 ) ;
//新建文字節點
Text new_node = doc.createTextNode(“中華民國98年”);
//取得舊文字節點
Text old_node = (Text) target_node.getChildNodes().item( 0 ) ;
//進行替換
target_node.replaceChild(new_node, old_node) ;
}
//儲存XML文件
…
這是什麼?

getElementsByTagName()的用法
› 哪一種物件才能使用?參數的意義?傳回?

NodeList的用法
› getLength() ?
› item() ?

Node的用法
› getChildNodes() ?
› replaceChild() ?

程式範例
<?xml version = "1.0" ?>
<!DOCTYPE LoveMessage [
<!ELEMENT LoveMessage ( message )>
<!ELEMENT message ( #PCDATA )>
]>
<LoveMessage>
<message>I love you, Dad!</message>
</LoveMessage>
Parser
//利用 DocumentBuilder物件 的parse方法
//1. 產生DocumentBuilderFactory物件
DocumentBuilderFactory dfactory = DocumentBuilderFactory.newInstance();
dfactory.setValidating(true); //啟動validating處理機制
//2. 產生DocumentBuilder物件
DocumentBuilder blder = dfactory.newDocumentBuilder() ;
//自己的錯誤處理類別程式
blder.setErrorHandler(new YourErrorHandler() ) ;
//3. parse XML文件
Document doc = blder.parse(new File (filename) ); //掃描錯誤會丟出錯誤
public class YourErrorHandler implements ErrorHandler {
public void fatalError (SAXParseException e) throws SAXException {
throw e ;
}
public void error (SAXParseException e) throws SAXException {
throw e ;
}
}
public void warning (SAXParseException e) throws SAXException {
System.out.println(“My Warning : “ + e.getMessage( ) ) ;
}

了解一下ErrorHandler類別
› 幾種錯誤?
› 查到的套件需要用import匯入java程式

編譯一下, 跑跑看
› javac ValidateXMLDoc.java YourErrorHandler.java
› java ValidateXMLDoc

ErrorHandler類別
› org.xml.sax
查到的套件需要用import匯入java程式
 程式範例

//Attr 類別
Document doc = … ;
//產生屬性節點
//如果是要產生具備命名空間的屬性節點怎可以使用Document物件的
//createAttributeNS(“URI”, qualified_name)
Attr attr_node = doc.createAttribute (“attr”) ;
attr_node.setValue(“val”) ; //attr = val
//將屬性節點加到一個元素節點
Element elem = …. ;
elem.setAttributeNode(attr_node) ; //注意:不是用appendChild()

了解一下Attr類別
 org.w3c.dom
 查到的套件需要用import匯入java程式
從根節點開始
 以遞迴方式遊走每個子節點

A
A
B
B
C
D
E
F
C
D
E
F
node
traverseNode(node)
呼叫
呼叫
childlist
traverseChildNodes(child_list)
public void traverseNode( Node currentNode )
{
switch ( currentNode.getNodeType() ) {
case Node.DOCUMENT_NODE: // 一個 Document 節點
Document doc = ( Document ) currentNode;
System.out.println( "Document 節點: " + doc.getNodeName() + "\n根元素: " +
doc.getDocumentElement().getNodeName() );
traverseChildNodes( doc.getChildNodes() );
break;
case Node.ELEMENT_NODE: // 一個 Element 節點
System.out.println( "\nElement node: " + currentNode.getNodeName() );
NamedNodeMap attrNodes = currentNode.getAttributes();
for ( int i = 0; i < attrNodes.getLength(); i++){
Attr attr = ( Attr ) attrNodes.item( i );
}
System.out.println( "\t屬性: " + attr.getNodeName() + " ; 值 = " + attr.getNodeValue() );
traverseChildNodes( currentNode.getChildNodes() );
break;
case Node.CDATA_SECTION_NODE: // CDATA 節點
case Node.TEXT_NODE: //文字節點
Text txt = ( Text ) currentNode;
if ( !txt.getNodeValue().trim().equals( "" ) )
System.out.println( "\t文字節點: " + txt.getNodeValue() );
break;
case Node.COMMENT_NODE : // 註解節點
Comment cmt = ( Comment ) currentNode;
if ( !cmt.getNodeValue().trim().equals( "" ) )
System.out.println( "\t註解節點: " + cmt.getNodeValue() );
break;
case Node.PROCESSING_INSTRUCTION_NODE : // PI節點
ProcessingInstruction pi = (ProcessingInstruction) currentNode;
System.out.println( "\tPI節點: target=" + pi.getTarget() + " data=" + pi.getData());
break;
}
}
public void traverseChildNodes( NodeList child_list)
{
if ( child_list.getLength() != 0 )
}
for ( int i = 0; i < child_list.getLength(); i++)
traverseNode( child_list.item( i ) );
//主程式
public static void main( String args[] )
{
if ( args.length < 1 ) {
System.err.println( "執行方式: java TraverseDOMDoc <filename>" );
System.exit( 1 );
}
}
TraverseDOMDoc traverseDOM = new TraverseDOMDoc( args[ 0 ] );

了解一下Node類別
› getNodeName()
› getNodeValue()
› 各種型態節點的常數表示法
› 了解一下NamedNodeMap類別
 它跟Attr類別有沒有關係
› 查到的套件需要用import匯入java程式
› 程式範例

java TraverseDOMDoc
顧客資料.xml

JAVA DOM API的運用
› 修改XML文件內容
 getElementsByTagName()
 replaceChild()
› 進階屬性節點的操作
 Attr類別
› 驗證(Validate) XML 文件
› 遊走XML DOM Tree
 各種型態節點的常數表示法
 NamedNodeMap類別

similar documents