- 浏览: 700626 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (239)
- 系统架构设计 (16)
- java collection framework (2)
- java分布式 (4)
- java多线程 (0)
- 故障处理及调优 (16)
- 软件开发过程及管理 (28)
- OS (5)
- 常用算法 (3)
- design pattern (8)
- transaction (7)
- java apps (48)
- corejava (7)
- java and DB (10)
- cache (0)
- webservice (14)
- web前端 (25)
- 报表 (4)
- 日志系统设计 (3)
- Oracle (4)
- mysql (11)
- xml (11)
- 数据源配置管理 (3)
- 企业数据存储 (4)
- php (2)
- 测试 (1)
最新评论
-
orangebook:
对于初学者来说,这样编写可能会误导,理解更烦锁。
观察者模式(发布-订阅) -
liudajiang:
呵呵 startThreads(rand ...
实践缩小Java synchronized 粒度 -
zengwenbo5566:
谢谢博主,学习了
解决getOutputStream() has already been called for this response -
u011335423:
大神厉害啊 可以了
解决getOutputStream() has already been called for this response -
xiang37:
...
解决getOutputStream() has already been called for this response
在本系列的第一篇文章中,我研究了一些用 Java 编写的主要的 XML 文档模型的性能。但是,在开始选择这种类型的技术时,性能只是问题的一部分。使用方便至少是同样重要的,并且它已是一个主要理由,来支持使用 Java 特定的模型,而不是与语言无关的 DOM 。
为切实了解哪个模型真正的作用,您需要知道它们在可用性程度上是如何排名的。本文中,我将尝试进行这个工作,从样本代码开始,来演示如何在每个模型中编码公共类型的操作。并对结果进行总结来结束本文,而且提出了促使一种表示比另一种更容易使用的一些其它因素。
请参阅以前的文章(请参阅 参考资料或本文“内容”下的便捷链接)来获取这个对比中使用的各个模型的背景资料,包含实际的版本号。还可以参阅“参考资料”一节中关于源代码下载、到模型主页的链接以及其它相关信息。
在对不同文档表示中用法技术的这些对比中,我将显示如何在每种模型中实现三种基本操作:
- 根据输入流构建文档
- 遍历元素和内容,并做一些更改:
- 从文本内容中除去前导和尾随的空白。
- 如果结果文本内容为空,就删除它。
- 否则,将它包装到父元素的名称空间中一个名为“text”的新元素中。
- 将已修改的文档写入输出流
这些示例的代码是以我在上篇文章中使用的基准程序为基础的,并进行了一些简化。基准程序的焦点是为了显示每个模型的最佳性能;对于本文,我将尝试显示在每种模型中实现操作的最简便方法。
我已经将每个模型的示例结构化为两个独立的代码段。第一段是读取文档、调用修改代码和编写已修改文档的代码。第二段是真正遍历文档表示和执行修改的递归方法。为避免分散注意力,我已在代码中忽略了异常处理。
您可以从本页底部 参考资料一节链接到下载页,以获取所有样本的完整代码。样本的下载版本包括一个测试驱动程序,还有一些添加的代码用于通过计算元素、删除和添加的个数来检查不同模型的操作。
即使您不想使用 DOM 实现,但还是值得浏览下面对 DOM 用法的描述。因为 DOM 示例是第一个示例,所以与后面的模型相比,我用它来探究有关该示例的一些问题和结构的更详细信息。浏览这些内容可以补充您想知道的一些细节,如果直接阅读其它模型之一,那么将错过这些细节。
DOM 规范涵盖了文档表示的所有类型的操作,但是它没有涉及例如对文档的语法分析和生成文本输出这样的问题。包括在性能测试中的两种 DOM 实现,Xerces 和 Crimson,对这些操作使用不同的技术。清单 1 显示了 Xerces 的顶级代码的一种形式。
1 // parse the document from input stream ("in") 2 DOMParser parser = new DOMParser(); 3 parser.setFeature("http://xml.org/sax/features/namespaces", true); 4 parser.parse(new InputSource(in)); 5 Document doc = parser.getDocument(); 6 // recursively walk and modify document 7 modifyElement(doc.getDocumentElement()); 8 // write the document to output stream ("out") 9 OutputFormat format = new OutputFormat(doc); 10 XMLSerializer serializer = new XMLSerializer(out, format); 11 serializer.serialize(doc.getDocumentElement()); |
正如我在注释中指出的,清单 1 中的第一块代码(第 1-5 行)处理对输入流的语法分析,以构建文档表示。Xerces 定义了 DOMParser
类,以便从 Xerces 语法分析器的输出构建文档。 InputSource
类是 SAX 规范的一部分,它能适应供 SAX 分析器使用的几种输入形式的任何之一。通过单一调用进行实际的语法分析和文档构造,如果成功完成了这一操作,那么应用程序就可以检索并使用已构造的 Document
。
第二个代码块(第 6-7 行)只是将文档的根元素传递给我马上要谈到的递归修改方法。这些代码与本文中所有文档模型的代码在本质上是相同的,所以在剩余的示例中我将跳过它,不再做任何讨论。
第三个代码块(第 8-11 行)处理将文档作为文本写入输出流。这里, OutputFormat
类包装文档,并为格式化生成的文本提供了多种选项。 XMLSerializer
类处理输出文本的实际生成。
Xerces 的 modify 方法只使用标准 DOM 接口,所以它还与任何其它 DOM 实现兼容。清单 2 显示了代码。
1 protected void modifyElement(Element element) { 2 // loop through child nodes 3 Node child; 4 Node next = (Node)element.getFirstChild(); 5 while ((child = next) != null) { 6 // set next before we change anything 7 next = child.getNextSibling(); 8 // handle child by node type 9 if (child.getNodeType() == Node.TEXT_NODE) { 10 // trim whitespace from content text 11 String trimmed = child.getNodeValue().trim(); 12 if (trimmed.length() == 0) { 13 // delete child if nothing but whitespace 14 element.removeChild(child); 15 } else { 16 // create a "text" element matching parent namespace 17 Document doc = element.getOwnerDocument(); 18 String prefix = element.getPrefix(); 19 String name = (prefix == null) ? "text" : (prefix + ":text"); 20 Element text = 21 doc.createElementNS(element.getNamespaceURI(), name); 22 // wrap the trimmed content with new element 23 text.appendChild(doc.createTextNode(trimmed)); 24 element.replaceChild(text, child); 25 } 26 } else if (child.getNodeType() == Node.ELEMENT_NODE) { 27 // handle child elements with recursive call 28 modifyElement((Element)child); 29 } 30 } 31 } |
清单 2 中显示的方法所使用的基本方法与所有文档表示的方法相同。 通过一个元素调用它,它就依次遍历那个元素的子元素。如果找到文本内容子元素,要么删除文本(如果它只是由空格组成的),要么通过与包含元素相同的名称空间中名为“text”的新元素来包装文本(如果有非空格的字符)。如果找到一个子元素,那么这个方法就使用这个子元素,递归地调用它本身。
对于 DOM 实现,我使用一对引用: child
和 next
来跟踪子元素排序列表中我所处的位置。在对当前子节点进行任何其它处理之前,先装入下个子节点的引用(第 7 行)。这样做使得我能够删除或替代当前的子节点,而不丢失我在列表中的踪迹。
当我创建一个新元素来包装非空白的文本内容(第 16-24 行)时,DOM 接口开始有点杂乱。用来创建元素的方法与文档关联并成为一个整体,所以我需要在所有者文档中检索当前我正在处理的元素(第 17 行)。我想将这个新元素放置在与现有的父元素相同的名称空间中,并且在 DOM 中,这意味着我需要构造元素的限定名称。根据是否有名称空间的前缀,这个操作会有所不同(第 18-19 行)。利用新元素的限定名称,以及现有元素中的名称空间 URI,我就能创建新元素(第 20-21 行)。
一旦创建了新元素,我只要创建和添加文本节点来包装内容 String
,然后用新创建的元素来替代原始文本节点(第 22-24 行)。
1 // parse the document from input stream 2 System.setProperty("javax.xml.parsers.DocumentBuilderFactory", 3 "org.apache.crimson.jaxp.DocumentBuilderFactoryImpl"); 4 DocumentBuilderFactory dbf = DocumentBuilderFactoryImpl.newInstance(); 5 dbf.setNamespaceAware(true); 6 DocumentBuilder builder = dbf.newDocumentBuilder(); 7 Document doc = builder.parse(in); 8 // recursively walk and modify document 9 modifyElement(doc.getDocumentElement()); 10 // write the document to output stream 11 ((XmlDocument)doc).write(out); |
清单 3 中的 Crimson DOM 示例代码使用了用于语法分析的 JAXP 接口。JAXP 为语法分析和转换 XML 文档提供了一个标准化的接口。本示例中的语法分析代码还可以用于 Xerces(对文档构建器类名称的特性设置有适当的更改)来替代较早给定的 Xerces 特定的示例代码。
在本示例中,我首先在第 2 行到第 3 行中设置系统特性来选择要构造的 DOM 表示的构建器工厂类(JAXP 仅直接支持构建 DOM 表示,不支持构建本文中讨论的任何其它表示)。仅当想选择一个要由 JAXP 使用的特定 DOM 时,才需要这一步;否则,它使用缺省实现。出于完整性起见,我在代码中包含了设置这个特性,但是更普遍的是将它设置成一个 JVM 命令行参数。
接着我在第 4 行到第 6 行中创建构建器工厂的实例,对使用那个工厂实例构造的构建器启用名称空间支持,并从构建器工厂创建文档构建器。最后(第 7 行),我使用文档构建器来对输入流进行语法分析并构造文档表示。
为了写出文档,我使用 Crimson 中内部定义的基本方法。不保证在 Crimson 未来版本中支持这个方法,但是使用 JAXP 转换代码来将文档作为文本输出的替代方法需要诸如 Xalan 那样的 XSL 处理器的。那超出了本文的范围,但是要获取详细信息,可以查阅 Sun 中的 JAXP 教程。
使用 JDOM 的顶级代码比使用 DOM 实现的代码稍微简单一点。为构建文档表示(第 1-3 行),我使用带有由参数值禁止验证的 SAXBuilder
。通过使用提供的 XMLOutputter
类,将已修改的文档写入输出流同样简单(第 6-8 行)。
1 // parse the document from input stream 2 SAXBuilder builder = new SAXBuilder(false); 3 Document doc = builder.build(in); 4 // recursively walk and modify document 5 modifyElement(doc.getRootElement()); 6 // write the document to output stream 7 XMLOutputter outer = new XMLOutputter(); 8 outer.output(doc, out); |
清单 5 中 JDOM 的 modify 方法也比 DOM 的同一方法简单。我获取包含元素所有内容的列表并扫描了这张列表,检查文本(象 String
对象那样的内容)和元素。这张列表是“活的”,所以我能直接对它进行更改,而不必调用父元素上的方法。
1 protected void modifyElement(Element element) { 2 // loop through child nodes 3 List children = element.getContent(); 4 for (int i = 0; i < children.size(); i++) { 5 // handle child by node type 6 Object child = children.get(i); 7 if (child instanceof String) { 8 // trim whitespace from content text 9 String trimmed = child.toString().trim(); 10 if (trimmed.length() == 0) { 11 // delete child if only whitespace (adjusting index) 12 children.remove(i--); 13 } else { 14 // wrap the trimmed content with new element 15 Element text = new Element("text", element.getNamespace()); 16 text.setText(trimmed); 17 children.set(i, text); 18 } 19 } else if (child instanceof Element) { 20 // handle child elements with recursive call 21 modifyElement((Element)child); 22 } 23 } 24 } |
创建新元素的技术(第 14-17 行)非常简单,而且与 DOM 版本不同,它不需要访问父文档。
dom4j 的顶级代码比 JDOM 的稍微复杂些,但是它们的代码行非常类似。这里的主要区别是我保存了用来构建 dom4j 文档表示的 DocumentFactory
(第 5 行),并在输出已修改的文档文本之后刷新了 writer(第 10 行)。
1 // parse the document from input stream 2 SAXReader reader = new SAXReader(false); 3 Document doc = reader.read(in); 4 // recursively walk and modify document 5 m_factory = reader.getDocumentFactory(); 6 modifyElement(doc.getRootElement()); 7 // write the document to output stream 8 XMLWriter writer = new XMLWriter(out); 9 writer.write(doc); 10 writer.flush(); |
正如您在清单 6 中看到的,dom4j 使用一个工厂方法来构造文档表示(从语法分析构建)中包含的对象。根据接口来定义每个组件对象,所以实现其中一个接口的任何类型的对象都能包含在表示中(与 JDOM 相反,它使用具体类:这些类在某些情况中可以划分子类和被继承,但是在文档表示中使用的任何类都需要以原始 JDOM 类为基础)。通过使用不同工厂进行 dom4j 文档构建,您能获取不同系列的组件中构造的文档。
在样本代码(第 5 行)中,我检索了用于构建文档的(缺省)文档工厂,并将它存储在一个实例变量( m_factory
)中以供 modify 方法使用。并不严格需要这一步 — 可以在一个文档中同时使用来自不同工厂的组件,或者可以绕过工厂而直接创建组件的实例 — 但在该例中,我只想创建与在文档其余部分中使用的同一类型的组件,并且使用相同的工厂来确保完成这个步骤。
1 protected void modifyElement(Element element) { 2 // loop through child nodes 3 List children = element.content(); 4 for (int i = 0; i < children.size(); i++) { 5 // handle child by node type 6 Node child = (Node)children.get(i); 7 if (child.getNodeType() == Node.TEXT_NODE) { 8 // trim whitespace from content text 9 String trimmed = child.getText().trim(); 10 if (trimmed.length() == 0) { 11 // delete child if only whitespace (adjusting index) 12 children.remove(i--); 13 } else { 14 // wrap the trimmed content with new element 15 Element text = m_factory.createElement 16 (QName.get("text", element.getNamespace())); 17 text.addText(trimmed); 18 children.set(i, text); 19 } 20 } else if (child.getNodeType() == Node.ELEMENT_NODE) { 21 // handle child elements with recursive call 22 modifyElement((Element)child); 23 } 24 } 25 } |
清单 7 中 dom4j modify 方法与 JDOM 中使用的方法非常类似。不通过使用 instanceof
运算符来检查内容项的类型,我可以通过 Node
接口方法 getNodeType
来获取类型代码(也可以使用 instanceof
,但类型代码方法看起来更清晰)。通过使用 QName
对象来表示元素名称和通过调用已保存的工厂的方法来构建元素可以区别新元素的创建技术(第 15-16 行)。
清单 8 中 Electric XML(EXML)的顶级代码是任何这些示例中最简单的一个,通过单一方法调用就可以读取和编写文档。
1 // parse the document from input stream 2 Document doc = new Document(in); 3 // recursively walk and modify document 4 modifyElement(doc.getRoot()); 5 // write the document to output stream 6 doc.write(out); |
清单 9 中 EXML modify 方法尽管与 JDOM 一样,需要使用 instanceof
检查,但它与 DOM 方法最相似。在 EXML 中,无法创建一个带名称空间限定的名称的元素,所以取而代之,我创建新元素,然后设置其名称来达到相同的效果。
1 protected void modifyElement(Element element) { 2 // loop through child nodes 3 Child child; 4 Child next = element.getChildren().first(); 5 while ((child = next) != null) { 6 // set next before we change anything 7 next = child.getNextSibling(); 8 // handle child by node type 9 if (child instanceof Text) { 10 // trim whitespace from content text 11 String trimmed = ((Text)child).getString().trim(); 12 if (trimmed.length() == 0) { 13 // delete child if only whitespace 14 child.remove(); 15 } else { 16 // wrap the trimmed content with new element 17 Element text = new Element(); 18 text.addText(trimmed); 19 child.replaceWith(text); 20 text.setName(element.getPrefix(), "text"); 21 } 22 } else if (child instanceof Element) { 23 // handle child elements with recursive call 24 modifyElement((Element)child); 25 } 26 } 27 } |
XPP 的顶级代码(在清单 10 中)是所有示例中最长的一个,与其它模型相比,它需要相当多的设置。
1 // parse the document from input stream 2 m_parserFactory = XmlPullParserFactory.newInstance(); 3 m_parserFactory.setNamespaceAware(true); 4 XmlPullParser parser = m_parserFactory.newPullParser(); 5 parser.setInput(new BufferedReader(new InputStreamReader(in))); 6 parser.next(); 7 XmlNode doc = m_parserFactory.newNode(); 8 parser.readNode(doc); 9 // recursively walk and modify document 10 modifyElement(doc); 11 // write the document to output stream 12 XmlRecorder recorder = m_parserFactory.newRecorder(); 13 Writer writer = new OutputStreamWriter(out); 14 recorder.setOutput(writer); 15 recorder.writeNode(doc); 16 writer.close(); |
因为使用 JAXP 接口,所以我必须首先创建分析器工厂的实例并在创建分析器实例之前启用名称空间处理(第 2-4 行)。一旦获取了分析器实例,我就能将输入设置到分析器中,并真正构建文档表示(第 5-8 行),但是这涉及比其它模型更多的步骤。
输出处理(第 11-16 行)也涉及比其它模型更多的步骤,主要因为 XPP 需要 Writer
而不是直接将 Stream
作为输出目标接受。
清单 11 中 XPP modify 方法尽管需要更多代码来创建新元素(第 13-21 行),但它与 JDOM 方法最类似。名称空间处理在这里有点麻烦。我首先必须创建元素的限定名称(第 15-16 行),然后创建元素,最后在稍后设置名称和名称空间 URI(第 18-21 行)。
1 protected void modifyElement(XmlNode element) throws Exception { 2 // loop through child nodes 3 for (int i = 0; i < element.getChildrenCount(); i++) { 4 // handle child by node type 5 Object child = element.getChildAt(i); 6 if (child instanceof String) { 7 // trim whitespace from content text 8 String trimmed = child.toString().trim(); 9 if (trimmed.length() == 0) { 10 // delete child if only whitespace (adjusting index) 11 element.removeChildAt(i--); 12 } else { 13 // construct qualified name for wrapper element 15 String prefix = element.getPrefix(); 16 String name = (prefix == null) ? "text" : (prefix + ":text"); 17 // wrap the trimmed content with new element 18 XmlNode text = m_parserFactory.newNode(); 19 text.appendChild(trimmed); 20 element.replaceChildAt(i, text); 21 text.modifyTag(element.getNamespaceUri(), "text", name); 22 } 23 } else if (child instanceof XmlNode) { 24 // handle child elements with recursive call 25 modifyElement((XmlNode)child); 26 } 27 } 28 } |
DOM、dom4j 和 Electric XML 都得到这些几乎同样易于使用的代码样本,其中 EXML 可能最简单,而 dom4j 受一些小条件限制而较困难。DOM 提供了与语言无关的非常实在的好处,但是如果你只使用 Java 代码,那么通过与 Java 特定的模型相比较,它看上去有点麻烦。我认为这表明 Java 特定的模型通常成功地实现简化 Java 代码中的 XML 文档处理这个目标。
尽管如此,对于使用多种语言的开发人员来说,DOM 仍是一个非常好的选择。DOM 实现广泛应用于多种编程语言。它还是许多其它与 XML 相关的标准的基础,所以即使您使用 Java 特定的模型,也还有一个您逐步熟悉 DOM 所需要的好机会。因为它正式获得 W3C 推荐(与基于非标准的 Java 模型相对),所以在某些类型的项目中可能也需要它。
就使用方便这一范畴而言,在 JDOM、dom4j 和 Electric XML 这三个主要竞争者中,dom4j 与其它两个的区别在于它使用带有多个继承层的基于接口的方法。这会使得遵循 API JavaDocs 更为困难些。例如,您正在寻找的一个方法(例如 content()
,在我们 dom4j 的 modify 方法示例的第 3 行中使用的)可能是 Element
扩展的 Branch
接口的一部分,而不是 Element
接口本身的一部分。尽管如此,这种基于接口的设计添加了许多灵活性(请参阅侧栏 超越基础:真实世界可用性)。考虑到 dom4j 的性能、稳定性和特性设置的优点,您应把它当作多数项目中的一个有力的候选者。
在任一 Java 特定的文档模型之中,JDOM 可能拥有最广泛的用户基础,并且它的确是使用起来最简单的模型之一。尽管如此,作为项目开发的一个选择,它还是必须容忍 API 的不固定性和从一个版本到下一个版本的更新,在性能对比中它也表现得很糟糕。基于当前实现,我愿为着手新项目的人们推荐 dom4j,而不是 JDOM。
除了 XPP 以外,EXML 比其它任何模型占用的资源都要少得多,并且考虑到 EXML 易于使用的优点,您应肯定会认为它适用于 jar 文件大小很重要的应用程序。但是,EXML 的 XML 支持的局限性和受限的许可证,以及在较大文件上所表现出的相对拙劣的性能,不得不在许多应用程序中放弃使用它。
XPP 在语法分析和编写文本文档时需要更多步骤,并且在处理名称空间时也需要更多步骤。如果 XPP 打算添加一些便利的方法来处理其中一些常见情况,那么在对比中它可能会更胜一筹。正如它现在所表现的,上篇文章中性能方面的领先者却成了本文中的可用性方面的失败者。尽管如此,因为 XPP 性能方面的优势,所以对于需要较小的 jar 文件大小的应用程序还是值得将它作为 EXML 的替代方法。
到目前为止在我写的两篇文章中,涉及到用 Java 编写的 XML 文档模型的性能和可用性。在本系列的后两篇文章中,我将讨论用 Java 技术进行 XML 数据绑定的方法。这些方法与文档模型的方法有许多相似处,但是它们更进一步将 XML 文档映射到实际应用程序数据结构中。我们将看到这一操作在使用的简便性和提高性能方面是如何做得如此好的。
回到 developerWorks,检查 Java 代码的 XML 数据绑定的实质。同时,您可以通过下面链接的论坛,给出您对本文的评论和问题。
您可以参阅本文在 developerWorks 全球站点上的 英文原文.
- 单击本文顶部或底部的 讨论,参与本文的 论坛。
- 如果您需要背景资料,尝试 developerWorks 的 XML Java 编程教程、 理解 SAX教程和 理解 DOM教程。
- 从 下载页面下载本文中使用的测试程序和文档模型库。
- 查找有关 Java APIs for XML Processing (JAXP)或者阅读 JAXP Tutorial。
- 回顾作者以前的文章: XML in Java: Document models, part 1。
- 根据 Tony Darugar 的团队对几个大型 XML 项目的分析,参考他对 Effective DOM with Java的建议。
- Java 的 XML 文档模型:
- 请查看 IBM 的 WebSphere Studio Application Developer,它是一个实现 DOM 的用于 Java、XML 和 Web 服务的集成可视编程环境。
- 想要提高您的技能吗?请检查 XML 认证页― IBM 专业教育计划的一部分。
|
Dennis Sosnoski 是西雅图地区 Java 咨询公司 Sosnoski Software Solutions, Inc.的创始人和首席顾问,他是 J2EE、XML 和 Web 服务支持方面的专家。他已经有 30 多年专业软件开发经验,最近几年他集中研究服务器端的 Java 技术。Dennis 经常在全国性的会议上就 XML 和 Java 技术发表演讲,您可以通过 mailto:dms@sosnoski.com?cc=dms@sosnoski.com与 Dennis 联系。 |
发表评论
-
xml文件解析之JDom
2010-04-04 19:36 1227以下示例比较简单,仅供初学者参考。 生成xml文件,引 ... -
xml文件解析之Dom
2010-04-04 19:31 1380以下示例比较简单,仅供初学者参考。 生成XML文件,引 ... -
xml文件解析之Dom4j
2010-04-04 19:21 1869以下示例比较简单,仅供初学者参考。 示例引用包:dom4j- ... -
Java XML API 漫谈
2008-10-02 08:40 1126在IBM的developerWorks上有几篇非常优秀的关于J ... -
Java 中的XML: 数据绑定 代码生成方法 — JAXB 及其它
2008-09-30 13:07 2766企业 Java 专家 Dennis Sosnoski 研究了几 ... -
Java 中的 XML: 文档模型,第一部分:性能
2008-09-30 12:12 1004在本文中,Java 顾问 Denn ... -
xml的基础知识4
2008-09-29 15:02 13175、XML 与显示的结合 第 1 部分说到过,XML 的设计目 ... -
xml的基础知识2
2008-09-29 15:00 16653、处理 XML 的 API 基于 X ... -
xml的基础知识1
2008-09-29 14:59 11291、HTML 的历史,大家可以更容易理解 XML 要解决什么问 ... -
webservice中涉及到的编码转换(用的axis引擎)
2008-09-10 14:07 4307最近和第三方合作过程中遇到一个问题:web服务中的编码转换. ...
相关推荐
例如,JDOM使用Java对象模型直接映射XML元素,而DOM4J则提供了灵活且强大的XML处理功能。 5. JAXB (Java Architecture for XML Binding): 这是一个用于将Java对象转换为XML表示和反之的框架。JAXB允许我们在Java类...
《Java and XML(英文第三版)_java_xml_birdsolc_源码》是关于Java与XML集成编程的一本权威指南,特别适合于那些希望深入理解如何在Java应用程序中有效地使用XML技术的开发者。这本书详细阐述了Java平台上的XML处理...
首先,Java提供了两种主要的API来处理XML:DOM(文档对象模型)和SAX(简单API for XML)。DOM解析器会将整个XML文件加载到内存中,形成一个树形结构,适合处理小到中等规模的XML文档。而SAX解析器采用事件驱动的...
java.awt.im.spi 提供启用可以与 Java 运行时环境一起使用的输入方法开发的接口。 java.awt.image 提供创建和修改图像的各种类。 java.awt.image.renderable 提供用于生成与呈现无关的图像的类和接口。 java.awt....
在Java中更新XML文档,开发者可以根据项目需求选择合适的方法。直接读写文件的方法虽然简单,但效率低且不易维护;XmlDocument适用于特定的解析器;DOM Level 2的Transformer接口和DocumentBuilderFactory提供了更...
dom4j是一个非常灵活且功能丰富的Java XML API,它提供了对DOM(文档对象模型),SAX(简单API for XML)和JDOM的支持。dom4j的核心特性包括: 1. **DOM解析器**: 支持W3C DOM Level 2接口,允许开发者以树形结构...
Java解析XML文件是Java开发中常见的一项任务,XML(eXtensible Markup Language)作为一种结构化数据存储格式,被广泛用于数据交换、配置文件和Web服务等场景。本篇文章将详细探讨Java如何利用DOM4J库来解析XML文件...
本笔记将深入探讨如何使用DOM(文档对象模型)和DOM4J库来创建XML文档。 一、DOM解析器 DOM是W3C推荐的一种XML解析标准,它将整个XML文档加载到内存中,形成一棵树形结构,称为DOM树。通过DOM,我们可以方便地访问...
在Java中,处理XML有多种方法,每种都有其特点和适用场景。下面将详细介绍Java中操作XML的四种主要方式,并提供相关的学习资源。 1. DOM解析器: DOM(Document Object Model)模型是W3C推荐的标准,它将整个XML...
10. **XML和Java EE**:在Java企业级环境中使用XML,如EJB(Enterprise JavaBeans)的配置文件,以及Web应用的部署描述符。 11. **XML和Java Persistence API (JPA)**:探讨XML在JPA中的角色,如ORM(Object-...
### Java语言编程中更新XML文档的四种常用方法 在Java编程中,XML作为一种常见的数据交换格式,被广泛应用于各种场景之中。随着Java技术的发展,Java提供了多种方式来处理XML文档,其中更新XML文档是最基本也是最...
在XML数据绑定中,Java Bean充当了数据模型的角色,其属性对应于XML文档中的元素或属性。 JAXB的核心功能包括: 1. **序列化**:将Java对象转换为XML文档。通过JAXBContext实例,我们可以获取Marshaller对象,然后...
理解这些概念和使用方法对于进行有效的 XML 处理至关重要。在实践中,你需要根据具体需求选择合适的解析器和验证机制,以确保高效且正确地处理 XML 数据。在提供的压缩包文件 "dtd-xml" 中,可能包含了更多关于 DTD ...
2. **添加元素和属性**:使用`createElement`方法创建XML元素,`appendChild`方法将元素添加到文档中,`setAttribute`方法设置元素的属性。 ```java Element root = doc.createElement("root"); // 创建根元素 doc....
文档解释了它们的特性和使用方法。 5. **输入/输出流**:Java I/O系统支持文件操作、网络通信等,如InputStream、OutputStream、Reader、Writer等类族。 6. **多线程**:Java提供了Thread类和Runnable接口来实现...
Java是一种广泛使用的编程语言,尤其在处理数据存储和交换时,XML(Extensible Markup Language)文档经常被用作数据格式。本项目“java自动创建和读取XML文档”旨在教你如何在MyEclipse环境中利用Java来操作XML文件...
例如,在数字图书馆或内容管理系统中,XML用于描述文档的元数据,Java解析XML可用于高效地检索和管理这些元数据。 ### 结论 Java解析XML是一项基本而关键的技术,适用于多种场景。开发者应根据实际需求选择合适的...
- 使用JAXB:Java标准库中的JAXB可以将XML对象绑定到Java类,然后再通过Gson或Jackson转换为JSON。 3. 示例代码: - Jackson示例: ```java ObjectMapper jsonMapper = new ObjectMapper(); ObjectMapper xml...
本教程将深入探讨Java中使用DOM模型解析XML文件的方法。 首先,我们需要了解DOM的基本概念。DOM将XML文档视为一个节点树,其中根节点代表整个文档,其他节点则表示文档的各种元素、属性、文本等。通过DOM API,我们...