`
M_ittrue
  • 浏览: 75216 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

dom4j的简单应用

 
阅读更多
  在做一个进销存项目,底层存储结构由原先的Mysql改为了直接用xml来存,所以特意去学了一下dom4j的一些使用方法。
  可能一些例子会借用网上已流传开来的代码,毕竟挺适合入门的。
  先贴代码吧。
 /**
     *
     * @param filename
     * @return:return o stand for sucessfully! return 1 stand for fail!
     * @throws IOException 
     */
    public int createXmlFile(String filename) throws IOException{
    	int returnValue = 0;
    	//取得document对象,也就是XML文档对象
    	Document document = org.dom4j.DocumentHelper.createDocument();
    	//建立根结点
    	Element booksElement = document.addElement("books");
    	//加一行注解
    	booksElement.addComment("This is my Dom4J test firstly!!");
    	//建立第一个子结点
    	Element bookElement = booksElement.addElement("book");
    	//为子结点添加属性
    	bookElement.addAttribute("show", "yes");
    	//为子结点添加一个title标题
    	bookElement.addElement("title").setText("Lucene Studing");
    	
    	//建立第二个子结点
    	bookElement = booksElement.addElement("book");
    	//为子结点添加属性
    	bookElement.addAttribute("show", "yes");
    	//为子结点添加一个title标题
    	bookElement.addElement("title").setText("Dom4j  Tutorials");
    	
    	//建立第三个子结点
    	bookElement = booksElement.addElement("book");
    	//为子结点添加属性
    	bookElement.addAttribute("show", "yes");
    	//为子结点添加一个title标题
    	bookElement.addElement("title").setText("Lucene in Action");
    	
    	//建立第四个结点
    	Element owner = booksElement.addElement("owner");
    	owner.setText("O'Reilly");
    	File file = new File(filename);
    	FileWriter fw = new FileWriter(file);
    	OutputFormat format = OutputFormat.createPrettyPrint();
    	format.setEncoding("GBK");
    	org.dom4j.io.XMLWriter xmlWriter = new XMLWriter(fw,format);
    	xmlWriter.write(document);
    	xmlWriter.flush();
    	xmlWriter.close();
    	returnValue = 1;
		return returnValue;
    	
    }
    
    public int ModiXMLFile(String filename,String newfilename) throws IOException{
    	int resultvale = 0;
    	//取得document结象
    	try {
			SAXReader reader = new org.dom4j.io.SAXReader(filename);
			Document document = reader.read(new File(filename));
			//取得list
			List list = document.selectNodes("/books/book/@show");
			Iterator iter = list.iterator();
			while(iter.hasNext()){
				Attribute attribute = (Attribute)iter.next();
				if(attribute.getValue().equals("yes")){
					attribute.setValue("no");
				}
			}
			
			list = document.selectNodes("/books/owner");
			iter = list.iterator(); 
			if(iter.hasNext()){
				Element owner = (Element)iter.next();
				owner.setText("Tshinghua");
				Element dataElement = owner.addElement("data");
				dataElement.setText("2011-10-11");
				dataElement.addAttribute("type", "Gregorian calendar");
			}
			
			list = document.selectNodes("/books/book");
			iter = list.iterator();
			while(iter.hasNext()){
				Element bookElement = (Element)iter.next();
				Iterator iterator = bookElement.elementIterator("title");
				while(iterator.hasNext()){
					Element titleElement = (Element)iterator.next();
					if(titleElement.getText().equals("Dom4j Tutorials")){
						bookElement.remove(titleElement);
					}
				}
			}
			XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
			writer.write(document);
			writer.close();
			return resultvale;
		} catch (SAXException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	
    	return resultvale;
    }
    
    /**
     * 格式化XML 文档,并解决中文问题
     * @param filename
     * @return
     * @throws IOException 
     */
    public int formatXMLFile(String filename) throws IOException{
    	/** 返回操作结果, 0 表失败, 1 表成功*/
    	int returnValue = 0;
    	SAXReader reader = new SAXReader();
    	try {
			Document document = reader.read(new File(filename));
			XMLWriter writer = null;
			//得到格式化输出对像
			//紧凑型
			OutputFormat format = OutputFormat.createCompactFormat();
			//优雅型
			//OutputFormat format = OutputFormat.createPrettyPrint();
			//设定格式化的字符集,以支持中文 
			format.setEncoding("UTF-8");
			writer = new XMLWriter(new FileWriter(new File(filename)),format);
		    writer.write(document);
		    writer.close();
		    returnValue =1;
    	} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
    	
    	return returnValue;
    }
    
    /**
     * 各种迭代法
     * @param document
     * @throws DocumentException
     */
    public void bar(Document document) throws DocumentException {
    	Element root = document.getRootElement();
    	//迭代根元素下面的所有子元素
    	for ( Iterator i = root.elementIterator(); i.hasNext(); ) {
    	Element element = (Element) i.next();
    	//处理代码
    	}
    	//迭代根元素下面名称为"foo"的子元素
    	for ( Iterator i = root.elementIterator( "foo" ); i.hasNext(); ) {
    	Element foo = (Element) i.next();
    	//处理代码
    	}
    	// 迭代根元素的属性attributes)元素
    	for ( Iterator i = root.attributeIterator(); i.hasNext(); ) {
    	Attribute attribute = (Attribute) i.next();
    	// do something
    	}
    	}

   上面是网上的一些代码例子,我自已是理解了,然后重新敲了一遍。体会是dom4j在读写操作xml方面还是挺不错的,生成xml文件实际是一个建树的过程,一个node一个node的接上去,然后对每个node加上一些属性,数值。最终会建成一颗只有一个根结点的树。当建好树,你想写入到真正的文件中时,如有中文,可以格式化一下文档对像,有两种排列文式可以让你选技,当然,不同版本的DOM4J可能有不同的外插件实现更多的人性化功能,而我觉得本身它最终的开发版功能已经足够了。
    而对xml文件进行读取的时候,实际上是一个反向过程,它提供了XPATH等快速定位结点的功能,再结合一系列的迭代方法,相信你可以很快的找到你想要的结点,进而对它进行修改,删除等一系列操作。
    下面贴出我写的一个添加表单的方法,以供大家学习。
/**
	 * 添加新的进货单到xml中
	 * 
	 * @flag:1:为进货单 2:为出货单 3:为借卖单 4为借出单
	 * @return:如果操作成功返回1,否则反回0;
	 * @throws IOException
	 */
	public int AddStockList(Object obj) throws IOException {
		int resultvale = 0;
		Document document = null;
		try {
			SAXReader reader = new org.dom4j.io.SAXReader();
			document = reader.read(new File("rc/进货单.xml"));

			Element rootElement = document.getRootElement();

			Element saleListElement = rootElement.addElement("进货单号").addAttribute("进货单号", "")
					.addAttribute("日期", "").addAttribute("录入人", "")
					.addAttribute("经手人", "").addAttribute("供应商名称", "")
					.addAttribute("联系人", "").addAttribute("联系方式", "")
					.addAttribute("总金额", "").addAttribute("已付款", "");

			Element goodElement = saleListElement.addElement("进货项");
			Element publicElement = goodElement.addElement("货物名称");
			publicElement.setText("");
			publicElement = goodElement.addElement("批次");
			publicElement.setText("");
			publicElement = goodElement.addElement("规格");
			publicElement.setText("");
			publicElement = goodElement.addElement("描述");
			publicElement.setText("");
			publicElement = goodElement.addElement("单价");
			publicElement.setText("");
			publicElement = goodElement.addElement("数量");
			publicElement.setText("");
			Element entryElement = goodElement.addElement("已入库记录")
					.addAttribute("入库总数量", "");
			publicElement = entryElement.addElement("入库记录")
					.addAttribute("日期", "").addAttribute("数量", "");

			Element expenditureElement = saleListElement.addElement("出账记录");
			Element dataElement = expenditureElement.addElement("出账日期");
			dataElement.setText("");
			Element moneyElement = expenditureElement.addElement("出账金额");
			moneyElement.setText("");

			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("GBK");
			XMLWriter writer = new XMLWriter(new FileWriter(new File(
					"rc/进货单.xml")),format);
			writer.write(document);
			writer.close();
			return resultvale;
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return resultvale;
	}
	


/**
	 * 以清单号来查询数据
	 * @param number
	 * @return
	 */
	public Object SelectByNumber(String number){
		SAXReader reader = new org.dom4j.io.SAXReader();
		Document document;
		try {
			document = reader.read(new File("rc/借出单.xml"));
			Element rootElement = document.getRootElement();
			Iterator iter = rootElement.elementIterator();
			while(iter.hasNext()){
				Element infoElement = (Element)iter.next();
				if(infoElement.attributeValue("借卖单号").equals(number)){
					//取数据
				}
			}
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 保存修改后的清单
	 * @param boj
	 */
	public void SaveGoodsList(Object obj,String number){
		SAXReader reader = new org.dom4j.io.SAXReader();
		Document document;
		try {
			document = reader.read(new File("rc/借卖单.xml"));
			Element rootElement = document.getRootElement();
			Iterator iter = rootElement.elementIterator();
			while(iter.hasNext()){
				Element infoElement = (Element)iter.next();
				if(infoElement.attributeValue("借卖单号").equals(number)){
					//移除该结点,利用add方法加入新结点
					document.remove(infoElement);
					AddMarginSellingList(obj);
				}
			}
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("GBK");
			XMLWriter writer = new XMLWriter(new FileWriter(new File(
					"rc/借卖单.xml")),format);
			writer.write(document);
			writer.close();
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 以清单号来删除某一清单
	 * @param obj
	 * @param number
	 */
	public void DelGoodsList(String number){
		SAXReader reader = new org.dom4j.io.SAXReader();
		Document document;
		try {
			document = reader.read(new File("rc/借卖单.xml"));
			Element rootElement = document.getRootElement();
			Iterator iter = rootElement.elementIterator();
			while(iter.hasNext()){
				Element infoElement = (Element)iter.next();
				if(infoElement.attributeValue("借卖单号").equals(number)){
					//移除该结点,利用add方法加入新结点
					System.out.println(infoElement.getName());
					rootElement.remove(infoElement);
				}
			}
			OutputFormat format = OutputFormat.createPrettyPrint();
			format.setEncoding("GBK");
			XMLWriter writer = new XMLWriter(new FileWriter(new File(
					"rc/借卖单.xml")),format);
			writer.write(document);
			writer.close();
		} catch (DocumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

 
分享到:
评论

相关推荐

    DOM4J介绍及应用

    DOM4J介绍及应用的一个PPT文档,简单的介绍了DOM4J,感觉很实用

    Dom4j是一个易用的、开源的库

    DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。然而他自己带的指南 只有短短一页(html),不过说的到挺全。国内的中文资料很少。因而俺写这个短小的教程方便大家使用,这篇文章仅谈及基本的用法...

    Dom4j解析配置文件与xml小例子

    Dom4j解析xml与配置文件的小例子,简单的Dom4j的小应用。

    dom4j-1.6.1.jar jar包

    dom4j是一个非常非常优秀的JavaXML API 越来越多的Java软件都在使用dom4j来读写XML ...它应用于Java平台,采用了Java集合框架并完全支持DOM,SAX和JAXP DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用

    DOM4J使用简介(很实用)

    DOM4J是dom4j.org出品的一个开源XML解析包,它的网站中这样定义: Dom4j is an easy to use, open source library for working with XML, XPath and XSLT on the Java platform using the ...DOM4J使用起来非常简单。

    开源XML解析包dom4j

    DOM4J使用起来非常简单。只要你了解基本的XML-DOM模型,就能使用。然而他自己带的指南只有短短一页(html),不过说的到挺全。国内的中文资料很少。因而俺写这个短小的教程方便大家使用,这篇文章仅谈及基本的用法...

    dom4j从基础到精通

    从朋友那拿到的很好的java语言 xml解析入门简单应用

    java_Dom4j解析XML详解

    DOM4J是 dom4j.org 出品的一个...DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP。  DOM4J 使用起来非常简单。只要你了解基本的 XML-DOM 模型,就能使用。  Dom:把整个文档作为一个对象。

    dom4j的用法包括简单的文件的创建、修改,以及xpath的应用

    dom4j的用法包括简单的文件的创建、修改,以及xpath的应用 其中一个chm,一个html文件,一个java文件。 chm对dom4j的用法做了详细的说明,html文件对xpath的应用做了详细的说明,java文件是整合的一个例子。 其中chm...

    基于java swing和dom4j的购物管理系统

    基于Java Swing和DOM4J的购物管理系统是一款基于Java语言开发的图形化应用程序,用于管理和展示商品信息、订单信息和用户信息等。该系统采用MVC架构,使用Java Swing编写用户界面,使用DOM4J解析和操作XML文件存储...

    dom4j解析xml

    简单易懂,清晰明了,具有较高的可读性,应用范围广。

    javaweb 简单案例

    《JavaWeb---简单应用---服务器向客户端提供音乐资源》---用到的技术dom4j,JSTL,EL表达式

    疯狂XML讲义(Web Service).pdf

    第三部分介绍了DOM、SAX、JAXP、dom4j、JDOM、XQuery和XQJ等,其中的DOM、SAX、JAXP、dom4j和JDOM都以结构化的方式来创建、解析XML文档,从而可以将XML文档作为数据传输工具,而XQuery则是一种新规范,通过XQuery...

    疯狂XML讲义

    第三部分介绍了DOM、SAX、JAXP、dom4j、JDOM、XQuery和XQJ等,其中的DOM、SAX、JAXP、dom4j和JDOM都以结构化的方式来创建、解析XML文档,从而可以将XML文档作为数据传输工具,而XQuery则是一种新规范,通过XQuery...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part4

    3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 3.6 解析名称空间 96 3.6.1 dom和名称空间 96 3.6.2 sax和名称空间 97 3.6.3 jdom和名称空间 98 3.6.4 dom4j和...

    疯狂xml讲义

    第三部分介绍了DOM、SAX、JAXP、dom4j、JDOM、XQuery和XQJ等,其中的DOM、SAX、JAXP、dom4j和JDOM都以结构化的方式来创建、解析XML文档,从而可以将XML文档作为数据传输工具,而XQuery则是一种新规范,通过XQuery...

    疯狂XML讲义.part3.rar

    第三部分介绍了DOM、SAX、JAXP、dom4j、JDOM、XQuery和XQJ等,其中的DOM、SAX、JAXP、dom4j和JDOM都以结构化的方式来创建、解析XML文档,从而可以将XML文档作为数据传输工具,而XQuery则是一种新规范,通过XQuery...

    疯狂XML讲义.part1

    第三部分介绍了DOM、SAX、JAXP、dom4j、JDOM、XQuery和XQJ等,其中的DOM、SAX、JAXP、dom4j和JDOM都以结构化的方式来创建、解析XML文档,从而可以将XML文档作为数据传输工具,而XQuery则是一种新规范,通过XQuery...

    疯狂XML讲义.part2.rar

    第三部分介绍了DOM、SAX、JAXP、dom4j、JDOM、XQuery和XQJ等,其中的DOM、SAX、JAXP、dom4j和JDOM都以结构化的方式来创建、解析XML文档,从而可以将XML文档作为数据传输工具,而XQuery则是一种新规范,通过XQuery...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part2

    3.5.1 下载并配置dom4j 88 3.5.2 dom4j api介绍 88 3.5.3 第一个实例 92 3.5.4 第二个实例 94 3.6 解析名称空间 96 3.6.1 dom和名称空间 96 3.6.2 sax和名称空间 97 3.6.3 jdom和名称空间 98 3.6.4 dom4j和...

Global site tag (gtag.js) - Google Analytics