2013-07-29 83 views
1

我瞭解我想用一個Document對象每次XML的Java和我必須寫:Stepts用於創建文檔對象

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); 
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder(); 
Document doc = dBuilder.parse(fXmlFile); 

我知道它是如何工作的進一步,但究竟在發生那3條線?爲什麼我需要DocumentBuilderFactory然後DocumentBuilder才能建立Document

更新:你能給我一個例子,我不應該寫第2行完全一樣嗎?我沒有看到爲新文檔實例化2個對象的要點。他們的有效作用是什麼?

回答

1

1)廠(創建的東西)可以創建的DocumentBuilder

獲得一個的DocumentBuilderFactory的新實例。這個靜態方法 創建一個新的工廠實例。

2)

創建使用當前 配置參數的DocumentBuilder的新實例。

3)

將給定文件作爲XML文檔的內容,並返回一個新 DOM文檔對象。如果 文件爲空,則拋出IllegalArgumentException。

Source

這是庫如何建立。沒有工廠,您將不能創建一個新的DocumentBuilder對象,因此將無法解析從的javadoc文件

0

右:

DocumentBuilderFactory.newInstance()

獲取DocumentBuilderFactory的新實例。這個靜態方法 創建一個新的工廠實例。此方法使用以下命令 查找程序來確定的DocumentBuilderFactory 實現類加載:

  • 使用javax.xml.parsers.DocumentBuilderFactory中的系統屬性。
  • 在JRE目錄中使用屬性文件「lib/jaxp.properties」。此配置文件採用標準java.util.Properties格式
    ,幷包含實現類
    的全限定名,其中的關鍵字是上面定義的系統屬性。 jaxp.properties文件僅由JAXP實現讀取一次,然後 將其值緩存供將來使用。如果第一次嘗試讀取文件時文件不存在
    ,則不會再嘗試檢查其是否存在。
    不可能在第一次讀取 後更改jaxp.properties中的任何屬性的值。
  • 使用Services API(詳見JAR規範)(如果可用)確定類名。 Services API將在文件Platform默認DocumentBuilderFactory 實例中尋找 類名。
    可用於運行時的jar文件中的META-INF/services/javax.xml.parsers.DocumentBuilderFactory
  • 平臺默認DocumentBuilderFactory實例。

一旦應用程序獲取對 基準的DocumentBuilderFactory它可以使用工廠來配置和獲取 解析器實例。

DocumentBuilderFactory.newDocumentBuilder()

創建使用當前 配置參數的DocumentBuilder的新實例。

返回:一個DocumentBuilder的新實例。

拋出:ParserConfigurationException - 如果DocumentBuilder不能成爲 創建它滿足請求的配置。

DocumentBuilder.parse()

將給定文件作爲XML文檔的內容,並返回一個新 DOM文檔對象。如果 文件爲空,則拋出IllegalArgumentException。

參數:f - 包含要解析的XML的文件。

返回:一個新的DOM Document對象。

拋出:IOException - 如果發生任何IO錯誤。 SAXException - 如果發生任何 解析錯誤。拋出:IllegalArgumentException - 當f是空

1

您使用的XML解析的方法被稱爲文檔對象模型(DOM)方法(注:這是不是唯一一個可用)和Java API for XML Processing (JAXP)的一部分。引用:

設計靈活,JAXP允許你使用任何兼容的XML- 解析器從您的應用程序中

,允許程序員使用任何XML解析器,系統需要避免使用具體實施。爲了能夠做到這一點,它決定在運行時使用稱爲Factory pattern的設計模式(引用)「...「

所以當你使用DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();時,返回的實例實際上並不是DocumentBuilder(它不可能 - 這是一個abstract類),但擴展DocumentBuilder另一個類的一個實例。你可以打印出實際的類在運行時驗證。

// returns com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl in my system 
System.out.println(dbFactory.getClass().getName());  

// returns com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl in my system 
System.out.println(dBuilder.getClass().getName()); 

例子,你就不需要使用前兩行,將是您可能會直接使用特定的解析實現(從而在您的項目中引入第三方依賴項)

我希望這可以幫助