创建Document对象的步骤

时间:2013-07-29 07:18:49

标签: java dom domdocument

我正在学习Java中的XML,每次我想使用Document对象时都要写:

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

我知道它是如何进一步发挥作用的,但这3行中究竟发生了什么?为什么我需要DocumentBuilderFactory然后DocumentBuilder来构建Document

更新:你能给我一个例子,我不应该写前两行完全相同吗?我没有看到为新文档实例化另外两个对象的重点。他们的有效作用是什么?

3 个答案:

答案 0 :(得分:1)

1)工厂(创建一些东西)可以创建一个DocumentBuilder

  

获取DocumentBuilderFactory的新实例。这种静态方法   创建一个新的工厂实例。

2)

  

使用当前版本创建DocumentBuilder的新实例   配置参数。

3)

  

将给定文件的内容解析为XML文档并返回   新的DOM Document对象。如果是,则抛出IllegalArgumentException   文件为null null。

Source

这就是构建库的方式。没有工厂,您将无法创建新的DocumentBuilder对象,因此无法解析文件

答案 1 :(得分:1)

用于XML解析的方法称为文档对象模型(DOM)方法(注意:它不是唯一可用的方法)和Java API for XML Processing (JAXP)的一部分。引用:

  

JAXP旨在提供灵活性,允许您使用任何符合XML的标准   您的应用程序中的解析器

为了允许程序员使用任何XML解析器,系统需要避免使用特定的实现。为了能够做到这一点,它使用称为Factory pattern的设计模式在运行时决定实现,其中(引用)“...处理创建对象(产品)的问题而不指定确切的类将要创建的对象。“

因此,当您使用DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();时,返回的实例实际上不是DocumentBuilder(它不可能是 - 这是abstract类),而是另一个扩展DocumentBuilder的类的实例{1}}。您可以在运行时打印实际的类来验证。

// 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() );

您不需要使用前两行的示例将是您将直接使用特定解析实现的情况(从而在您的项目中引入第三方依赖项)。

我希望这会有所帮助

答案 2 :(得分:0)

来自javadocs:

<强> 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中的类名   实例。
      罐子里的META-INF / services / javax.xml.parsers.DocumentBuilderFactory
      可用于运行时。
  •   
  • 平台默认的DocumentBuilderFactory实例。
  •   
     

一旦应用程序获得对a的引用   DocumentBuilderFactory它可以使用工厂来配置和获取   解析器实例。

<强> DocumentBuilderFactory.newDocumentBuilder()

  

使用当前版本创建DocumentBuilder的新实例   配置参数。

     

返回:DocumentBuilder的新实例。

     

抛出:ParserConfigurationException - 如果DocumentBuilder不能   已创建,满足所请求的配置。

<强> DocumentBuilder.parse()

  

将给定文件的内容解析为XML文档并返回   新的DOM Document对象。如果是,则抛出IllegalArgumentException   文件为null null。

     

参数:f - 包含要解析的XML的文件。

     

返回:一个新的DOM Document对象。

     

抛出:IOException - 如果发生任何IO错误。 SAXException - 如果有的话   发生解析错误。 IllegalArgumentException - 当f为null