我正在学习Java中的XML,每次我想使用Document对象时都要写:
DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(fXmlFile);
我知道它是如何进一步发挥作用的,但这3行中究竟发生了什么?为什么我需要DocumentBuilderFactory
然后DocumentBuilder
来构建Document
?
更新:你能给我一个例子,我不应该写前两行完全相同吗?我没有看到为新文档实例化另外两个对象的重点。他们的有效作用是什么?
答案 0 :(得分:1)
1)工厂(创建一些东西)可以创建一个DocumentBuilder
获取DocumentBuilderFactory的新实例。这种静态方法 创建一个新的工厂实例。
2)
使用当前版本创建DocumentBuilder的新实例 配置参数。
3)
将给定文件的内容解析为XML文档并返回 新的DOM Document对象。如果是,则抛出IllegalArgumentException 文件为null null。
这就是构建库的方式。没有工厂,您将无法创建新的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
时