- 浏览: 124856 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
愿景十月天:
两个表之间咋地关联呢?
hibernate 中HQL语句查询学习 -
xurichusheng:
LZ应该列出使用的jar包co.transport.jms.J ...
Spring的JMSTemplate的使用 -
lin_zy:
错误是显示在前台了,但问题还是美解决
Ajax4jsf 和 <h:message> 一起使用时候的问题 -
greemranqq:
<value>jdbc:mysql://local ...
Spring+JPA+MySQL的配置文件 -
successfulroof:
wyyacyy 写道可以详细介绍一下,a4j:commandL ...
动态自增表格rich:dataTable
[size=large]
(一)JDOM的介绍以及与JAXB的比较
Java + XML = JDOM !
这就是JDOM设计者的目标。如果你曾经使用过烦人的SAX或是DOM来处理XML,你就会知道为什么要有JDOM或者是JAXB。在今年(2002)的JavaOne会议上JDOM的主要创始人Jason Hunter有一篇精彩的演讲介绍了JDOM技术,题目就是JDOM Makes XML Easy。
在那篇文档里,JDOM被拿来与DOM比较,而我更愿意拿它同JAXB比较。因为JAXB和JDOM都是为了在Java中提供比DOM和SAX更为方便的XML处理接口而开发的,并且通过完全不同的途径来解决这个问题。JDOM的处理方式是与DOM类似的树操作。而JAXB通过DTD和绑定模式来生成访问XML文档的Java代码,将XML映射成了Java对象来操作。你可以根据项目的需要和个人喜好来决定采用哪一个。
JDOM与JAXB的比较,从本身的特点来看:
1) JDOM比JAXB更容易上手。使用JAXB首先要会编写DTD,然后还要会编写绑定模式。JDOM没有这样的要求,如果你会Java和XML,甚至可以说光是看JDOM的javadoc文档就能够使用JDOM。
2) JAXB编写好DTD和绑定模式以后,XML文档被映射成了Java对象,其数据就是Java对象的属性,连数据类型都做好了转换,因此,访问XML文档比JDOM要简便,可以说是一劳永逸。
3) JAXB由某个DTD和绑定模式生成的代码只能访问该DTD所约束的文档。如果想要访问其他XML文档,需要再编写DTD和绑定模式。JDOM可以处理任何XML文档,包括受约束的和不受约束的。
目前JDOM和JAXB都没有正式版本。JDOM的最新版本是beta8,JAXB是1.0 early access,其规范版本是0.21。相对而言,JDOM更成熟一些。例如JAXB不支持名字空间、不能向XML文档写入处理指令,有时我们需要保留的换行符和首尾空格在JAXB中自动过滤掉了,就连放在里面也不能幸免。JDOM就没有这些限制。如果说以上的3点比较是JDOM和JAXB本身的特点所决定的,几乎不可能改变,那么这里表明,JAXB还需要更多的工作。
(二)dom4j(实现了JDOM接口)对XML文件进行操作
xml文件定义如下:
[/size]
(一)JDOM的介绍以及与JAXB的比较
Java + XML = JDOM !
这就是JDOM设计者的目标。如果你曾经使用过烦人的SAX或是DOM来处理XML,你就会知道为什么要有JDOM或者是JAXB。在今年(2002)的JavaOne会议上JDOM的主要创始人Jason Hunter有一篇精彩的演讲介绍了JDOM技术,题目就是JDOM Makes XML Easy。
在那篇文档里,JDOM被拿来与DOM比较,而我更愿意拿它同JAXB比较。因为JAXB和JDOM都是为了在Java中提供比DOM和SAX更为方便的XML处理接口而开发的,并且通过完全不同的途径来解决这个问题。JDOM的处理方式是与DOM类似的树操作。而JAXB通过DTD和绑定模式来生成访问XML文档的Java代码,将XML映射成了Java对象来操作。你可以根据项目的需要和个人喜好来决定采用哪一个。
JDOM与JAXB的比较,从本身的特点来看:
1) JDOM比JAXB更容易上手。使用JAXB首先要会编写DTD,然后还要会编写绑定模式。JDOM没有这样的要求,如果你会Java和XML,甚至可以说光是看JDOM的javadoc文档就能够使用JDOM。
2) JAXB编写好DTD和绑定模式以后,XML文档被映射成了Java对象,其数据就是Java对象的属性,连数据类型都做好了转换,因此,访问XML文档比JDOM要简便,可以说是一劳永逸。
3) JAXB由某个DTD和绑定模式生成的代码只能访问该DTD所约束的文档。如果想要访问其他XML文档,需要再编写DTD和绑定模式。JDOM可以处理任何XML文档,包括受约束的和不受约束的。
目前JDOM和JAXB都没有正式版本。JDOM的最新版本是beta8,JAXB是1.0 early access,其规范版本是0.21。相对而言,JDOM更成熟一些。例如JAXB不支持名字空间、不能向XML文档写入处理指令,有时我们需要保留的换行符和首尾空格在JAXB中自动过滤掉了,就连放在里面也不能幸免。JDOM就没有这些限制。如果说以上的3点比较是JDOM和JAXB本身的特点所决定的,几乎不可能改变,那么这里表明,JAXB还需要更多的工作。
(二)dom4j(实现了JDOM接口)对XML文件进行操作
package dom_xml; import org.dom4j.Document; import org.dom4j.Element; import org.dom4j.Attribute; import java.util.List; import java.util.Iterator; import org.dom4j.io.OutputFormat; import org.dom4j.io.XMLWriter; import java.io.*; import org.dom4j.DocumentException; import org.dom4j.io.SAXReader; import org.dom4j.DocumentHelper; public class XmlDom4J { /** * 生成xml文件; * */ public void createXMLFile(){ //使用 DocumentHelper 类创建一个文档实例。 DocumentHelper 是生成 XML 文档节点的 dom4j API 工厂类。 Document document=DocumentHelper.createDocument(); //使用 addElement() 方法创建根元素 catalog 。addElement() 用于向 XML 文档中增加元素。 Element catalogElement = document.addElement("catalog"); //在 catalog 元素中使用 addComment() 方法添加注释“An XML catalog”。 catalogElement.addComment("An XML Catalog"); //在 catalog 元素中使用 addProcessingInstruction() 方法增加一个处理指令。 catalogElement.addProcessingInstruction("target","text"); //在 catalog 元素中使用 addElement() 方法增加 journal 元素。 Element journal=catalogElement.addElement("journal"); //使用 addAttribute() 方法向 journal 元素添加 title 和 publisher 属性。 journal.addAttribute("title", "XML Zone"); journal.addAttribute("publisher", "IBM Devoloperment"); //添加节点journal的子节点article,并设置其属性; Element articleElement=journal.addElement("article"); articleElement.addAttribute("level", "Intermediate"); articleElement.addAttribute("date", "December-2008"); //添加节点articleElement的子结点title,并使用 setText() 方法设置其元素的文本。 Element titleElement=articleElement.addElement("title"); titleElement.setText("又是下雨天"); //添加节点articleElement的子结点author.添加子结点的子结点firstname、lastname,并设置其文件; Element authorElement=articleElement.addElement("author"); Element firstNameElement=authorElement.addElement("firstname"); firstNameElement.setText("Marcello"); Element lastNameElement=authorElement.addElement("lastname"); lastNameElement.setText("Vitaletti"); //可以使用 addDocType() 方法添加文档类型说明。 XMLWriter output; try { OutputFormat format=new OutputFormat(); format.setEncoding("gb2312"); output = new XMLWriter( new FileWriter(new File("catalog.xml")),format); output.write(document); output.close(); } catch (IOException e) { e.printStackTrace(); } } /** * 修改xml文件指定节点的属性; * @param inputXml xml文件流 * @oldAttributeValue 原属性; * @attributeValue 要修改成的值; * @param XPath 要修改节点属性的表达式;如:"//article/@level" 则表示修改节点level(父节点为article)的属性 * 特别说明:@后面表示的是属性; */ public Document modifyXMLNodeAttributeByName(File inputXml, String XPath,String oldAttributeValue,String attributeValue) { if(XPath.indexOf("@")<0){ System.out.println("参数XPath无效,请在要修改的属性前加入'@'"); return null; } SAXReader saxReader = new SAXReader(); Document document=null; try { document = saxReader.read(inputXml); List list = document.selectNodes(XPath); Iterator iter = list.iterator(); while (iter.hasNext()) { Attribute attribute = (Attribute) iter.next(); if (attribute.getValue().equals(oldAttributeValue))//把原属性修改为新的属性; attribute.setValue(attributeValue); } } catch (DocumentException e) { e.printStackTrace(); } return document; } /** * 修改指定节点的属性值; * @param inputXml xml文件流 * @param XPath 要修改节点属性的表达式;如:"//article/@level" 则表示修改节点level(父节点为article)的属性 * @param attributeValue 属性新值; */ public Document modifyXMLNodeAttributeByName(File inputXml, String XPath,String attributeValue) { if(XPath.indexOf("@")<0){ System.out.println("参数XPath无效,请在要修改的属性前加入'@'"); return null; } SAXReader saxReader = new SAXReader(); Document document=null; try { document = saxReader.read(inputXml); List list = document.selectNodes(XPath); Iterator iter = list.iterator(); while (iter.hasNext()) { Attribute attribute = (Attribute) iter.next(); //把原属性修改为新的属性; attribute.setValue(attributeValue); } } catch (DocumentException e) { e.printStackTrace(); } return document; } /** * 获取某一节点的属性值; * @param inputxml xml文件; * @param XPath * @return */ public String[] getNodeAttributeValue(File inputxml,String XPath){ String nodeAttri="";//储存节点属性值; if(XPath.indexOf("@")<0){ return null; } SAXReader saxReader=new SAXReader(); Document document=null; try{ document=saxReader.read(inputxml); List list=document.selectNodes(XPath); Iterator it=list.iterator(); while(it.hasNext()){ Attribute attri=(Attribute)it.next(); nodeAttri+=attri.getValue()+","; } }catch(Exception e){ e.printStackTrace(); } if(nodeAttri.length()>0){ nodeAttri=nodeAttri.substring(0, nodeAttri.length()-1); } return nodeAttri.split(","); } /** * 修改指定节点的文本值; * @param inputXml * @param XPath 要修改节点属性的表达式;如:"//article/@level" 则表示article节点下的所有level节点的文本; * @param newText 新的文本值; */ public Document modifyXMLNodeTextByName(File inputXml,String XPath,String newText){ if(XPath.indexOf("@")>=0){ System.out.println("参数XPath无效!"); return null; } SAXReader saxReader = new SAXReader(); Document document=null; try { document=saxReader.read(inputXml); List list= document.selectNodes(XPath); Iterator iter = list.iterator(); while(iter.hasNext()){ Element elementText=(Element)iter.next(); elementText.setText(newText); } } catch (DocumentException e) { e.printStackTrace(); } return document; } /** * 替换指定节点文本的值。 * @param inputXml xml文件流 * @param XPath 要修改节点属性的表达式;如:"//article/level" 则表示article节点下的所有level节点的文本; * @param oldText 原文本 * @param newText 新文本; */ public Document modifyXMLNodeTextByName(File inputXml,String XPath,String oldText,String newText){ if(XPath.indexOf("@")>=0){ System.out.println("参数XPath无效!"); return null; } SAXReader saxReader = new SAXReader(); Document document=null; try { document=saxReader.read(inputXml); List list= document.selectNodes(XPath); Iterator iter = list.iterator(); while(iter.hasNext()){ Element elementText=(Element)iter.next(); if(elementText.getText().equals(oldText)) elementText.setText(newText); } } catch (DocumentException e) { e.printStackTrace(); } return document; } /** * 获取某一节点的文本内容; * @param inputxml xml文件; * @param XPath * @return */ public String[] getNodeTextValue(File inputxml,String XPath){ String nodeTextValue="";//储存节点属性值; if(XPath.indexOf("@")>=0){ return null; } SAXReader saxReader=new SAXReader(); Document document=null; try{ document=saxReader.read(inputxml); List list=document.selectNodes(XPath); Iterator it=list.iterator(); while(it.hasNext()){ Element text=(Element)it.next(); nodeTextValue+=text.getText()+","; } }catch(Exception e){ e.printStackTrace(); } if(nodeTextValue.length()>0){ nodeTextValue=nodeTextValue.substring(0, nodeTextValue.length()-1); } return nodeTextValue.split(","); } /** * 保存xml文件; * @param document xml文件流; * @param filePath 文件存储的全路径(包括文件名) * @code 储存的编码; */ public void saveXmlFile(Document document,String filePath,String code){ if(document==null){ return ; } XMLWriter output; try { OutputFormat format=new OutputFormat(); format.setEncoding(code); output = new XMLWriter(new FileWriter(new File(filePath)),format); output.write( document ); output.close(); } catch (IOException e) { e.printStackTrace(); } } // 测试; public static void main(String[] args){ XmlDom4J dom4jParser=new XmlDom4J(); //生成XML //dom4jParser.createXMLFile(); File file=new File("D:/MyWork/operateXMLfile/catalog.xml"); //dom4jParser.saveXmlFile(document, "F://test.xml", "GBK"); /*String[] attrArray=dom4jParser.getNodeAttributeValue(file, "//article/@level"); if(attrArray!=null){ for(int i=0;i<attrArray.length;i++){ System.out.println("Attribute is :"+attrArray[i]); } }*/ String[] nodeText=dom4jParser.getNodeTextValue(file, "//article/title"); if(nodeText!=null){ for(int i=0;i<nodeText.length;i++){ System.out.println("NODE TEXT IS:"+nodeText[i]); } } } }
xml文件定义如下:
<?xml version="1.0" encoding="gb2312"?> <catalog><!--An XML Catalog--><?target text?> <journal title="XML Zone" publisher="IBM Devoloperment"> <article level="小学四年级" date="December-2008"><title>又是下雨天</title> <author><firstname>Marcello</firstname><lastname>Vitaletti</lastname></author></article> <article level="大学四年级" date="2008-04-01"><title>太阳出来了</title> <author><firstname>Marcello</firstname><lastname>Vitaletti</lastname></author></article> </journal></catalog>
[/size]
评论
2 楼
fenxue
2008-06-02
确实很牛X,我先收下了,不过我打开dom4j的官方网站,版本是1.6.1发布于May 16, 2005,为什么到现在还没有更新啊???
1 楼
javaeyes
2008-05-21
牛X ,以为是JDOM ,进来一看是写的是DOM4J。先回家搞清楚DOM4J和JDOM哦
相关推荐
DOM4J是一个非常流行的Java库,用于处理XML文档,提供了丰富的API来实现XML的读取、写入、解析和操作。本篇文章将详细讲解如何利用DOM4j在Java环境中实现XML文件的创建(Create)、读取(Read)、更新(Update)和...
总的来说,这个压缩包是学习和实践DOM4J处理XML的理想资源。通过这些示例和教程,你可以深入理解DOM4J的API,掌握XML文档的创建、读取、更新和删除技巧,从而在实际项目中更加游刃有余地处理XML数据。
Dom4j是Java社区中一个非常流行的处理XML的库,它提供了全面且强大的API来解析、创建、操作XML文档。在这个案例中,我们将深入探讨如何利用Dom4j实现XML文档的增删改查操作,并遵循分层架构的思想来组织代码。 **一...
DOM4J(Document Object Model for XML)是一种轻量级、高效、功能丰富的Java API,用于处理XML文档。它提供了简单易用的接口来读取、写入、修改XML文档。DOM4J是一个开放源代码项目,在许多流行的Java应用中被广泛...
DOM4J是一个Java库,它提供了对XML文档的全面处理,包括解析、创建、修改和查询。在这个"XML实现的增删改查(CRUD)功能实例"中,我们将深入探讨如何使用DOM4J库来执行这些基本操作。 1. **增加(Create)**: 在XML...
它是PHP内建的一个功能,允许开发者以对象化的方式处理XML文档。通过`simplexml_load_file()`或`simplexml_load_string()`函数,我们可以轻松地加载XML文件或字符串,并将其转化为一个可以操作的对象。 **创建...
服务器端的JSP页面可以解析这些数据,生成XML文档,然后使用Java的DOM或SAX API将数据存入数据库。 - **Read(读取)**: 从数据库中检索数据时,JSP页面可以发起一个查询,将结果集转换为XML格式,然后显示在页面上...
XML(eXtensible Markup Language)是一种用于标记数据的语言,广泛应用于数据交换、配置存储以及文档结构化描述等领域。在IT行业中,XML文件的操作是必不可少的技能,特别是CRUD(Create, Read, Update, Delete)...
DOM 提供了一种统一的方式来处理 XML 文档,允许开发者以一种结构化的方式访问文档的内容。通过使用上述提到的基本对象及其方法,可以实现对 XML 数据的创建、读取、更新和删除(CRUD)操作。理解和掌握这些基本对象...
1. 加载XML文档:使用`XMLHttpRequest`对象或者`fetch` API加载XML文件,然后解析成DOM对象。 2. 查询数据:通过DOM遍历,如`getElementById`、`getElementsByTagName`、`querySelector`和`querySelectorAll`等方法...
DOM将XML文档转换为一个可操作的对象模型,使得开发者能够通过对象的属性和方法对XML进行增、删、改、查(CRUD)操作。 在PHP中,处理XML文档主要使用`DOMDocument`类。以下是对XML文档操作的一些关键点: 1. **...
标题 "Creating XML Documents with PL/SQL" 涉及到的是如何使用PL/SQL语言来创建、处理和解析XML文档。在Oracle数据库环境中,PL/SQL是常用的编程语言,它扩展了SQL的功能,使得开发者可以编写存储过程、函数、...
除了操作已有的XML文档,`DOMDocument`类还可以用来创建新的XML文档。创建新文档的步骤通常包括: - 初始化`DOMDocument`对象,指定版本和编码。 - 创建各种类型的节点元素,并使用`appendChild`方法将它们添加到父...
例如,Java的JAXB(Java Architecture for XML Binding)用于对象和XML之间的绑定,DOM4J、JDOM是流行的DOM解析库。Python的ElementTree库提供了简洁的XML处理方式。 七、XML在大数据与云计算中的应用 在大数据处理...
总的来说,“Dom4jTest.rar”项目展示了如何利用Java和DOM4J处理XML数据,以及如何将这些数据集成到SOAP Web服务中。通过这个项目,开发者可以学习到XML解析、Web服务开发以及如何在没有传统数据库的情况下存储和...
DOM模型使得编程语言能够动态地与XML文档交互,对数据进行增删改查。 ### 5. SAX(Simple API for XML):事件驱动的解析器 SAX是一种轻量级的、基于事件的XML解析器。与DOM不同,SAX不需要一次性加载整个文档到...
总的来说,"Markup(vc操作XML)"涵盖了使用VC++和MSXML库进行XML处理的关键概念和方法,包括XML文档的创建、解析、查询和修改。通过`Markup.cpp`和`Markup.h`中的实现,我们可以学习到如何在C++环境中高效地处理XML...
Java中的DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)等API可以用来读取和解析XML文档。语法分析涉及将XML文档分解成解析树,而词法分析则是识别XML文档中的各个令牌,...
或者,如果你使用SAX,可以在事件处理中修改数据,但通常需要构建一个新的XML文档。 删除XML元素通常涉及查找并移除特定的DOM节点。在SAX中,这可能需要跟踪状态并在适当的地方不处理或跳过节点。 最后,为了实现...
这种设计允许开发者利用熟悉的SQL语法来处理XML文档,简化了XML数据的管理。XML数据库的优势在于其灵活性和轻量级,尤其适用于小规模数据存储或作为临时数据交换格式。 XML的CRUD操作在C#中通常涉及以下几个关键...