转自本人博客:http://www.xgezhang.com/dom4j_xml_separata.html

dom4j是一个Java的XML API。类似于jdom。用来读写XML文件的。

dom4j是一个十分优秀的Java XML API,具有性能优异、功能强大和极其易使用的特点。同一时候它也是一个开放源码的软件。能够在SourceForge上找到它。在IBM developerWorks上面还能够找到一篇文章,对主流的Java XML API进行的性能、功能和易用性的评測,所以能够知道dom4j不管在哪个方面都是很出色的。

相比于Dom。don4j的使用更加有”Java”的感觉,也更加方便。

仅仅要知道xml文件的树形结构,便能够对节点进行加入、改动、删除等工作

    任务的目标是要把例如以下的xml文件,依照公司、即属性comp_name不同,分别分成两个xml文件。并把子节点中的全部属性提取出来放到元素中。

原始xml文件:

<?

xml version="1.0"?

>
<!-- edited with XMLSPY v2004 rel. 4 U (http://www.xmlspy.com) by Mr. Nobody (Altova GmbH) -->
<purchaseOrders>
<purchaseOrder comp_name="ABC">
<shipTo export-code="1" type="EU-Address">
<name>Helen Zoe</name>
<street>47 Eden Street</street>
<city>Cambridge</city>
<postcode>126</postcode>
</shipTo>
<item partNum="128-UL">
<productName>Jade earring</productName>
<quantity>5</quantity>
<price>179.90</price>
<shipDate>2000-02-14</shipDate>
</item>
</Items>
</purchaseOrder>
<purchaseOrder comp_name="IBM">
<shipTo export-code="3" type="US-Address">
<name>Google</name>
<street>47 Eden Street</street>
<city>Pal alto</city>
<postcode>95126</postcode>
</shipTo>
<item partNum="1289-UL">
<productName>Jade earring</productName>
<quantity>5</quantity>
<price>179.90</price>
<shipDate>2000-02-14</shipDate>
</item>
</Items>
</purchaseOrder>
<purchaseOrder comp_name="ABC">
<shipTo export-code="4" type="EU-Address">
<name>Zou</name>
<street>47 Eden Street</street>
<city>Cambridge</city>
<postcode>126</postcode>
</shipTo>
<billTo type="US-Address">
<name>Robert Smith</name>
<street>8 Oak Avenue</street>
<city>X Town</city>
<state>AK</state>
<zip>95819</zip>
</billTo>
<Items>
<item partNum="101AA">
<productName>Lapis necklace</productName>
<quantity>4</quantity>
<price>199.95</price>
<comment>The Gifts for the holidays!</comment>
<shipDate>1999-12-05</shipDate>
</item>
<item partNum="1281-UL">
<productName>Jade earring</productName>
<quantity>5</quantity>
<price>179.90</price>
<shipDate>2000-02-14</shipDate>
</item>
</Items>
</purchaseOrder>
</purchaseOrders>

须要生成两个文件,分别为ABC.xml和IBM.xml 例如以下:

ABC:<?xml version="1.0" encoding="UTF-8"?>

<purchaseOrders>
<ABC_COMP>
<purchaseOrder>
<item>
<partNum>229-OB</partNum>
<productName>Pearl necklace</productName>
<quantity>1</quantity>
<price>4879.00</price>
<shipDate>1999-12-05</shipDate>
</item>
<item>
<partNum>128-UL</partNum>
<productName>Jade earring</productName>
<quantity>5</quantity>
<price>179.90</price>
<shipDate>2000-02-14</shipDate>
</item>
</purchaseOrder>
<purchaseOrder/>
<purchaseOrder>
<shipTo>
<export-code>4</export-code>
<type>EU-Address</type>
<name>Zou</name>
<street>47 Eden Street</street>
<city>Cambridge</city>
<postcode>126</postcode>
</shipTo>
</purchaseOrder>
</ABC_COMP>
</purchaseOrders> IBM:
<?xml version="1.0" encoding="UTF-8"?> <purchaseOrders>
<IBM_COMP>
<purchaseOrder/>
<purchaseOrder>
<shipTo>
<export-code>3</export-code>
<type>US-Address</type>
<name>Google</name>
<street>47 Eden Street</street>
<city>Pal alto</city>
<postcode>95126</postcode>
</shipTo>
<item>
<partNum>1289-UL</partNum>
<productName>Jade earring</productName>
<quantity>5</quantity>
<price>179.90</price>
<shipDate>2000-02-14</shipDate>
</item>
</purchaseOrder>
<purchaseOrder/>
</IBM_COMP>
</purchaseOrders>

要实现这一功能。须要用到的操作有下面几部:



1、创建文档Document类型对象。读入原始文件ipo.xml。

2、找到其根节点,并递归遍历其整个树,而且把实用的信息提取出来。

3、分别输出两个分好类的文件。

具体的代码可以直接看实现过程,里面有非常具体的凝视,看完之后可以对DOM4J主要的处理思路有所了解:

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.List; import javax.jws.WebParam.Mode; import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter; public class dom4j {
static String compMode = ""; //静态全局变量。相应按不同公司分类的方式
/**
*
* @param node 原始文件节点,Element类型
* @param compNode 输出文件节点
*/
public static void separate(Element node,Element compNode){ //递归遍历函数
//System.out.println(node.getName());
List<Attribute> attrList = node.attributes(); //获取节点全部的属性元素
for (Attribute attr : attrList){
//System.out.println(attr.getValue());
if (node.getName().equals("purchaseOrder")){ //要实现的功能是选出属性名为IBM或ABC的purchaseOrder节点
if (!attr.getValue().equals(compMode)) return;
} else {
compNode.addElement(attr.getName().toString()); //addElement为加入节点
compNode.element(attr.getName().toString()).setText(attr.getValue().toString());//设置子节点的值为当前属性值
}
} if (!(node.getTextTrim().equals(""))) {
compNode.setText(node.getText());
} Iterator<Element> it = node.elementIterator(); //迭代器循环获取全部的子节点。并递归调用
while (it.hasNext()) {
Element e = it.next();
//if (node.getName().equals("purchaseOrders")) separate(e,compNode);
// if (!node.getName().equals("purchaseOrders")) {
Element nextCompNode = compNode.addElement(e.getName().toString());
separate(e,nextCompNode);
//}
}
} public static void writer(Document document,String filename) throws Exception{ //输出 xml文件
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8"); //设置编码方式
format.setIndent(true);
format.setIndent(" ");//设置缩进
XMLWriter writer = new XMLWriter(new OutputStreamWriter(new FileOutputStream(new File(filename)), "UTF-8"), format);
writer.write(document); //写入文件
writer.flush();
writer.close();
} public static void main(String[] args) throws Exception{
SAXReader reader = new SAXReader(); //使用SAXReader 读入文件结构
Document document = reader.read(new File("ipo.xml")); //创建Document对象
Element node = document.getRootElement(); //获取根节点node Document docABC = DocumentHelper.createDocument();
Document docIBM = DocumentHelper.createDocument(); Element ABCElement = docABC.addElement("purchaseOrders");
ABCElement = ABCElement.addElement("ABC_COMP");
Element IBMElement = docIBM.addElement("purchaseOrders");
IBMElement = IBMElement.addElement("IBM_COMP");
System.out.println(ABCElement.getName()); compMode = "ABC";
separate(node,ABCElement);
compMode = "IBM";
separate(node,IBMElement); writer(docABC,"ABC_COMP_dom4j.xml");
writer(docIBM,"IBM_COMP_dom4j.xml"); } }

用DOM4J包实现对xml文件按属性分离。的更多相关文章

  1. 【JAVA使用XPath、DOM4J解析XML文件,实现对XML文件的CRUD操作】

    一.简介 1.使用XPath可以快速精确定位指定的节点,以实现对XML文件的CRUD操作. 2.去网上下载一个“XPath帮助文档”,以便于查看语法等详细信息,最好是那种有很多实例的那种. 3.学习X ...

  2. JDOM方法实现对XML文件的解析

    首先要下载JDOM.jar包,下载地址:http://download.csdn.net/detail/ww6055/8880371 下载到JDOM.jar包之后导入到工程中去. 实例程序: book ...

  3. asp.net 实现对xml文件的 读取,添加,删除,修改

    用于修改站内xml文件 已知有一个XML文件(bookstore.xml)如下:<?xml version="1.0" encoding="gb2312" ...

  4. linux下使用libxml2实现对xml文件的读取及查询

    由于项目需要,这两天在用C++做XML文件解析的工作.在linux下有个很方便的操作xml文件的库——libxml2,它提供了一套创建和查询xml文件的C语言的接口.这篇博客主要介绍如何使用libxm ...

  5. 使用jq的ajax实现对xml文件的读取

    之前一直在用json来传递数据,但是xml也是不可缺少的,于是开始了xml的征程.xml的一些属性啊之类的在菜鸟教程上列举的已经很详细了,但是却没有前段部分的获取教程,查询资料,遂懂: index.x ...

  6. Android平台中实现对XML的三种解析方式

    本文介绍在Android平台中实现对XML的三种解析方式. XML在各种开发中都广泛应用,Android也不例外.作为承载数据的一个重要角色,如何读写XML成为Android开发中一项重要的技能. 在 ...

  7. 使用dom4j创建和解析xml文件

    使用dom4j创建和解析xml文件 在项目开发中,我们经常会遇到xml文件的创建和解析从别人接口得到的xml文件,而我们最常使用的组件是dom4j. 下面我就以代码来讲解一下如何使用dom4j来创建x ...

  8. Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密

    Java代码加密与反编译(二):用加密算法DES修改classLoader实现对.class文件加密 二.利用加密算法DES实现java代码加密 传统的C/C++自动带有保护机制,但java不同,只要 ...

  9. dom4j生成和解析xml文件

    dom4j生成和解析xml文件 要生成和解析如下格式的xml文件: <?xml version="1.0" encoding="UTF-8"?> & ...

随机推荐

  1. BZOJ2527: [Poi2011]Meteors(整体二分)

    Description Byteotian Interstellar Union (BIU) has recently discovered a new planet in a nearby gala ...

  2. 使用PyCharm安装第三方库

    使用PyCharm安装第三方库是一种十分简单的做法,接下来我来演示一下在PyCharm上安装第三方库requess的操作流程. 首先,先看一下当第三方库未安装时的提示内容,在pycharm中新建pyt ...

  3. Ubuntu配置图形桌面LXDE和VNC、中文语言包、中文输入法

    Ubuntu配置图形桌面LXDE和VNC.中文语言包.中文输入法 http://www.lijiejie.com/ubuntu-vps-config-lxde-vnc/ LXDE是Ubuntu图形桌面 ...

  4. css的三种表现形式

    1.行内样式(内嵌样式):结构的内部,即写在标签内的样式:写在标签的开始部分内部,style属性当中:<标记 style="样式的属性名1:样式的属性值1:属性名2:属性值2:.... ...

  5. Eclipse Class Decompiler——Java反编译插件手工配置方法

    最近在eclipse上配置了java反编译插件,但是不好用,原因是我的eclipse之前有手动配置过一些类似的java反编译插件,当我将原来的插件完全卸载后重新配置才正常配置上去,自动配置java反编 ...

  6. asp.net--TextBox属性全研究

    . .aspx代码例如以下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="T ...

  7. Android利用FTP实现与PC的上传和下载,实现二维码扫描下载

    之前给老板所带的本科生课程实验所写的代码,拿出来分享一下. 下载地址:  https://github.com/smartshuai/ConnectHelper.git

  8. GPUImage ==> 一个基于GPU图像和视频处理的开源iOS框架

    Logo 项目介绍: GPUImage是Brad Larson在github托管的开源项目. GPUImage是一个基于GPU图像和视频处理的开源iOS框架,提供各种各样的图像处理滤镜,并且支持照相机 ...

  9. liunx基本操作常用命令

    liunx通常用作服务器,运行服务器软件,服务器要等待,类似超市学关键命令操作 内核,外壳 shell命令跟内核打交道用的是发行版本,不是内核,Radhat公司的CentOS,阿里巴巴也用这个 liu ...

  10. Dynamics CRM 2015/2016 Web API:Unbound Function 和 Bound Function

    今天我们来看看Dynamics CRM Web API Function 吧, 这是一个新概念,刚接触的时候我也是比較的迷糊.这种命名确实是和之前的那套基于SOAP协议的API全然联系不上.好了,不说 ...