1

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

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

我知道它是如何进一步工作的,但是这 3 行中实际发生了什么?为什么我需要 aDocumentBuilderFactory然后 aDocumentBuilder来构建 a Document

更新:你能给我一个例子,我不应该把前两行写得一模一样吗?我看不到为新文档再实例化 2 个对象的意义。他们的有效作用是什么?

4

3 回答 3

1

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

JAXP 设计灵活,允许您在应用程序中使用任何符合 XML 的解析器

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

因此,当您使用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() );

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

我希望这有帮助

于 2013-07-29T09:31:52.830 回答
1

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

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

2)

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

3)

将给定文件的内容解析为 XML 文档并返回一个新的 DOM Document 对象。如果 File 为 null null,则会引发 IllegalArgumentException。

资源

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

于 2013-07-29T07:22:26.410 回答
0

直接来自 javadocs:

DocumentBuilderFactory.newInstance()

获取 DocumentBuilderFactory 的新实例。这个静态方法创建一个新的工厂实例。此方法使用以下有序查找过程来确定要加载的 DocumentBuilderFactory 实现类:

  • 使用 javax.xml.parsers.DocumentBuilderFactory 系统属性。
  • 使用 JRE 目录中的属性文件“lib/jaxp.properties”。此配置文件采用标准 java.util.Properties 格式
    ,包含实现类的完全限定名称,
    键是上面定义的系统属性。
    JAXP 实现只读取一次 jaxp.properties 文件,然后缓存它的值以供将来使用。
    如果在第一次尝试读取文件时文件不存在,则不会进一步
    尝试检查其是否存在。
    第一次读取 jaxp.properties 中的任何属性的值后,便无法更改它的值。
  • 如果可用,请使用服务 API(如 JAR 规范中所述)来确定类名。服务 API 将在文件平台默认 DocumentBuilderFactory 实例中查找类名。 运行时可用的
    jar 中的 META-INF/services/javax.xml.parsers.DocumentBuilderFactory 。
  • 平台默认 DocumentBuilderFactory 实例。

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

DocumentBuilderFactory.newDocumentBuilder()

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

返回: DocumentBuilder 的新实例。

抛出: ParserConfigurationException - 如果无法创建满足请求配置的 DocumentBuilder。

DocumentBuilder.parse()

将给定文件的内容解析为 XML 文档并返回一个新的 DOM Document 对象。如果 File 为 null null,则会引发 IllegalArgumentException。

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

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

抛出: IOException - 如果发生任何 IO 错误。SAXException - 如果发生任何解析错误。IllegalArgumentException - 当 f 为空时

于 2013-07-29T07:29:27.750 回答