java讀取xml配置文件

使用DOM解析XML文檔時,需要讀入整個XML文檔,然後在內存中創建DOM樹,生成DOM樹上的每個節點對象。只有在整個DOM樹創建完畢後,我們才能做其他的操作,即使我們只需要修改根元素節點的第二個子節點,仍然需要在進行這個小小的修改之間分析整個文檔,在內存中構建文檔樹。當XML文檔比較大時,構建DOM樹將花費大量的時間和內存。
一種替代的技術就是使用SAX,SAX允許你在讀取文檔的時候,即對它進行處理,解析完畢處理也就完成了,不必等待整個文檔被分析存儲之後才進行操作。


三步過程
爲了使用 XML 文件中的信息,必須解析文件以創建一個 Document 對象。
Document 對象是一個接口(??爲了統一嗎 ),因而不能直接將它實例化;一般情況下,應用程序會相應使用一個工廠。準確的過程因實現而異,但是基本思想是相同的。(同樣,Level 3 標準化了這個任務。)在這個例子 Java 環境中,解析文件是一個三步過程:
1.創建 DocumentBuilderFactory。 DocumentBuilderFactory 對象創建 DocumentBuilder。
2.創建 DocumentBuilder。 DocumentBuilder 執行實際的解析以創建 Document 對象。
3.解析文件以創建 Document 對象。
現在您可以開始構建應用程序了。
基本的應用程序
首先創建一個基本的應用程序,即一個名爲 OrderProcessor 的類。

『『 『 『

第一步是生成一個DocumentBuilderFactory對象,newInstance()是靜態方法,所以可以直接類名點調用。
第二步是用工廠生成一個DocumentBuilder對象,但是newDocumentBuilder()是抽象方法,還沒實現,在這裏就可以調用了嗎?還是像你以前說的,只要能產生一個抽象類的對象,那麼這個抽象類的所以抽象方法就都已經實現了?是這樣嗎


newDocumentBuilder()抽象方法肯定會被非抽象子類實現,這就發生了多態,執行時調用子類的重寫後的方法


view plaincopy to clipboardprint?
public class DocumentBuilderFactoryImpl extends DocumentBuilderFactory {
......................
}
sun的newInstance()方法
public static DocumentBuilderFactory newInstance() {
try {
return (DocumentBuilderFactory) FactoryFinder.find(
/* The default property name according to the JAXP spec */
"javax.xml.parsers.DocumentBuilderFactory",
/* The fallback implementation class name */
"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
} catch (FactoryFinder.ConfigurationError e) {
throw new FactoryConfigurationError(e.getException(),
e.getMessage());
}

}
public class DocumentBuilderFactoryImpl extends DocumentBuilderFactory { ...................... } sun的newInstance()方法 public static DocumentBuilderFactory newInstance() { try { return (DocumentBuilderFactory) FactoryFinder.find( /* The default property name according to the JAXP spec */ "javax.xml.parsers.DocumentBuilderFactory", /* The fallback implementation class name */ "com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl"); } catch (FactoryFinder.ConfigurationError e) { throw new FactoryConfigurationError(e.getException(), e.getMessage()); } }

它應該是用反射返回了一個DocumentBuilderFactoryImpl的實例,然後用DocumentBuilderFactory強轉,也就是:DocumentBuilderFactory.newInstance()返回一個Object類型的DocumentBuilderFactory實例,下面的就不用說了吧!




view plaincopy to clipboardprint?
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import java.io.File;
import org.w3c.dom.Document;

public class OrderProcessor {
public static void main (String args[]) {
File docFile = new File("orders.xml");
Document doc = null;
try {

DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.parse(docFile);

} catch (Exception e) {
System.out.print("Problem parsing the file: "+e.getMessage());
}
}
}
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import java.io.File; import org.w3c.dom.Document; public class OrderProcessor { public static void main (String args[]) { File docFile = new File("orders.xml"); Document doc = null; try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); DocumentBuilder db = dbf.newDocumentBuilder(); doc = db.parse(docFile); } catch (Exception e) { System.out.print("Problem parsing the file: "+e.getMessage()); } } }

首先,Java 代碼導入必要的類,然後它創建 OrderProcessor 應用程序。本教程中的例子僅處理一個文件,因此爲簡潔起見,應用程序包含了對該文件的直接引用。
因此 Document 對象可以在以後使用,應用程序把它定義在 try-catch 塊之外。
在 try-catch 塊中,應用程序創建了 DocumentBuilderFactory,然後再使用它來創建 DocumentBuilder。 最後,DocumentBuilder 解析文件以創建 Document。
解析器設置
使用 DocumentBuilder 創建解析器的優點之一在於能夠控制 DocumentBuilderFactory 創建的解析器上的各種設置。例如,可以設置解析器驗證文檔:
try {
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

dbf.setValidating(true);

DocumentBuilder db = dbf.newDocumentBuilder();
doc = db.parse(docFile);
} catch (Exception e) {
...
Java 的 DOM Level 2 實現允許通過以下方法控制解析器的參數:
setCoalescing():決定解析器是否要將 CDATA 節點轉換爲文本,以及是否要和周圍的文本節點合併(如果適用的話)。其默認值爲 false。
setExpandEntityReferences(): 確定是否要展開外部實體引用。如果爲 true,外部數據將插入文檔。其默認值爲 true。(請參閱參考資料以瞭解關於使用外部實體的技巧。)
setIgnoringComments():確定是否要忽略文件中的註釋。其默認值爲 false。
setIgnoringElementContentWhitespace():確定是否要忽略元素內容中的空白(類似於瀏覽器對待 HTML 的方式)。其默認值爲 false。
setNamespaceAware():確定解析器是否要注意名稱空間信息。其默認值爲 false。
setValidating():默認情況下,解析器不驗證文檔。將這個參數設置爲 true 可打開驗證功能。

W3C DOM

文檔對象模型(DOM)是與平臺和語言無關的接口,允許程序和腳本動態地訪問和更新文檔的內容,結構和樣式。文檔可以進一步處理,處理的結果可以放回到所提供的頁面中。


表3-1 用於處理XML文檔的DOM元素屬性

屬性名


描述

childNodes


返回當前元素所有子元素的數組

firstChild


返回當前元素的第一個下級子元素

lastChild


返回當前元素的最後一個子元素

nextSibling


返回緊跟在當前元素後面的元素

nodeValue


指定表示元素值的讀/寫屬性

parentNode


返回元素的父節點

previousSibling


返回緊鄰當前元素之前的元素


表3-2 用於遍歷XML文檔的DOM元素方法

方法名


描述

getElementById(id) (document)


獲取有指定唯一ID屬性值文檔中的元素

getElementsByTagName(name)


返回當前元素中有指定標記名的子元素的數組

hasChildNodes()


返回一個布爾值,指示元素是否有子元素

getAttribute(name)


返回元素的屬性值,屬性由name指定


表3-3 動態創建內容時所用的W3C DOM屬性和方法

屬性/方法


描述

document.createElement(tagName)


文檔對象上的createElement方法可以創建由tagName指定的元素。如果以串div作爲方法參數,就會生成一個div元素

Document.createTextNode(text)


文檔對象的createTextNode方法會創建一個包含靜態文本的節點

<element>.appendChild(childNode)


appendChild方法將指定的節點增加到當前元素的子節點列表。例如,可以增加一個option元素,作爲select元素的子節點。

<element>.getAttribute(name)


這些方法分別獲得和設置元素中name屬性的值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章