DOM4J的解析、创建、修改(资料部分转载)
来源:互联网 发布:淘宝卖家评论大全 编辑:程序博客网 时间:2024/06/04 19:08
与利用DOM、SAX、JAXP机制来解析xml相比,DOM4J 表现更优秀,具有性能优异、功能强大和极端易用使用的特点,只要懂得DOM基本概念,就可以通过dom4j的api文档来解析xml。dom4j是一套开源的api。实际项目中,往往选择dom4j来作为解析xml的利器。
先来看看dom4j中对应XML的DOM树建立的继承关系
针对于XML标准定义,对应于图2-1列出的内容,dom4j提供了以下实现:
同时,dom4j的NodeType枚举实现了XML规范中定义的node类型。如此可以在遍历xml文档的时候通过常量来判断节点类型了。
常用API
class org.dom4j.io.SAXReader
- read 提供多种读取xml文件的方式,返回一个Domcument对象
interface org.dom4j.Document
- iterator 使用此法获取node
- getRootElement 获取根节点
interface org.dom4j.Node
- getName 获取node名字,例如获取根节点名称为bookstore
- getNodeType 获取node类型常量值,例如获取到bookstore类型为1——Element
- getNodeTypeName 获取node类型名称,例如获取到的bookstore类型名称为Element
interface org.dom4j.Element
- attributes 返回该元素的属性列表
- attributeValue 根据传入的属性名获取属性值
- elementIterator 返回包含子元素的迭代器
- elements 返回包含子元素的列表
interface org.dom4j.Attribute
- getName 获取属性名
- getValue 获取属性值
interface org.dom4j.Text
- getText 获取Text节点值
interface org.dom4j.CDATA
- getText 获取CDATA Section值
interface org.dom4j.Comment
- getText 获取注释
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
上文转载处源于:http://www.cnblogs.com/macula/archive/2011/07/27/2118003.html
好了,废话够了,直接上代码了!
/** * 按照指定格式生成XML * @param <font color=red>测试示例:</font> * @param rootRow:code=1,nodeRow:name=outman&age=26&sex=男,nodeRow:name=xieshen&age=26&sex=男 * @param parameterStr 规范化XML创建参数 * @return */public Boolean createXml(String parameterStr){try{//创建Document对象 Document document = DocumentHelper.createDocument();//初始化子元素Element element = null;if(StringUtils.isNotBlank(parameterStr)){String []commaSplits = parameterStr.split("\\,");if(null!=commaSplits){for(String commaSplit : commaSplits){String []colonSplits = commaSplit.split("\\:");if(null!=colonSplits){if(colonSplits.length > 0){if(ROOT_ROW.equals(colonSplits[0])){//添加根节点element = document.addElement(ROOT_ROW);//给根节点添加备注element.addComment("根节点:rootRow");String []attrSplits = colonSplits[1].split("\\&");if(null!=attrSplits){if(attrSplits.length > 0){for(String attrSplit : attrSplits){String []attrAndValueSplits = attrSplit.split("\\=");if(null!=attrAndValueSplits){if(attrAndValueSplits.length>1){//跟根节点添加属性和值element.addAttribute(attrAndValueSplits[0], attrAndValueSplits[1]);}else{this.systemErrorPrint();}}else{this.systemErrorPrint();}}}else{this.systemErrorPrint();}}else{this.systemErrorPrint();}}else if(NODE_ROW.equals(colonSplits[0])){//在根节点的基础上,添加子节点Element element_ = element.addElement(NODE_ROW);//给子节点添加备注element_.addComment("子节点:nodeRow");String []attrSplits = colonSplits[1].split("\\&");if(null!=attrSplits){if(attrSplits.length > 0){for(String attrSplit : attrSplits){String []attrAndValueSplits = attrSplit.split("\\=");if(null!=attrAndValueSplits){if(attrAndValueSplits.length>1){//给子节点添加属性和值element_.addAttribute(attrAndValueSplits[0], attrAndValueSplits[1]);}else{this.systemErrorPrint();}}else{this.systemErrorPrint();}}element_.addText("这里是子节点的内容");}else{this.systemErrorPrint();}}else{this.systemErrorPrint();}}else{this.systemErrorPrint();}}else{this.systemErrorPrint();}}else{this.systemErrorPrint();}}}else{this.systemErrorPrint();}}else{this.systemErrorPrint();}//输出文件到指定路径XMLWriter writer = new XMLWriter(new FileWriter(new File(STORE_PATH)));writer.write(document);writer.close();System.out.println("1.创建指定规范XML成功,输出地址:"+STORE_PATH);return true;}catch(Exception ex){System.out.println("1.创建指定规范XML发生异常:"+ex.getMessage());return false;}}
/** * 修改指定内容,重新保存 * @return */public Boolean updateXml(){try{SAXReader saxReader = new SAXReader(); Document document = saxReader.read(new File(STORE_PATH));//这里需要用到jaxen-1.1-beta-6包,如果不导入则会发生异常@SuppressWarnings("unchecked")List<Attribute> attrValues = document.selectNodes("/rootRow/nodeRow/@name");if(null!=attrValues){if(attrValues.size()>0){Iterator<Attribute> interator = attrValues.iterator();while(interator.hasNext()){Attribute attribute = interator.next();if("outman".equals(attribute.getValue())){attribute.setValue("outman2013");}}}else{System.out.println("XML中没有/rootRow/nodeRow/@name节点");}}else{System.out.println("XML中没有/rootRow/nodeRow/@name节点");}//输出文件到指定路径XMLWriter writer = new XMLWriter(new FileWriter(new File(STORE_PATH)));writer.write(document);writer.close();return true;}catch(Exception ex){System.out.println("2.修改指定规范XML发生异常:"+ex.getMessage());return false;}}
/** * 读取指定路径下XML内容 * @return */@SuppressWarnings("unchecked")public Boolean parseXml(){try {SAXReader saxReader = new SAXReader(); Document document = saxReader.read(new File(STORE_PATH));Element element = document.getRootElement();System.out.println("根节点:"+element.getName());for(Iterator<Attribute> i = element.attributeIterator();i.hasNext();){Attribute attribute = i.next();System.out.println("根节点属性:"+attribute.getName() +" ,根节点属性值:"+ attribute.getValue());}for(Iterator<Element> i = element.elementIterator("nodeRow");i.hasNext();){Element element_p = i.next();System.out.println("子节点:"+element_p.getName());for(Attribute attribute : (List<Attribute>)element_p.attributes()){System.out.println("子节点属性:"+attribute.getName() +" ,子节点属性值:"+ attribute.getValue());}//这个地方的attributeIterator获取的长度是4,遍历的实际内容长度为3,会报错,换成attributes就可以了,这两个方法有何区别?//for(@SuppressWarnings("unchecked")Iterator<Attribute> i_ = element_p.attributeIterator();i.hasNext();){//Attribute attribute = i_.next();//System.out.println("子节点属性:"+attribute.getName() +" ,子节点属性值:"+ attribute.getValue());//}}return true;} catch (Exception ex) {System.out.println("DOM4J读取XML解析出现异常:"+ex.getMessage());return false;}}
main方法中测试
public static void main(String[] args) {long st1 = System.currentTimeMillis();DomParseXML domParseXML = new DomParseXML();//创建//domParseXML.createXml("rootRow:code=1,nodeRow:name=outman&age=26&sex=男,nodeRow:name=xieshen&age=26&sex=男");//修改//domParseXML.updateXml();//读取domParseXML.parseXml();long st2 = System.currentTimeMillis();System.out.println("执行秒数:" + ((st2-st1)/1000));}
为感兴趣的朋友,可以点击这里:
http://pan.baidu.com/share/link?shareid=280030&uk=1443215090
dom4j api 使用简介:
http://pan.baidu.com/share/link?shareid=280032&uk=1443215090
DOM、JDOM、SAX、DOM4J四种解析方式的比较
http://acjwht.blog.163.com/blog/static/33697435201161291653540
经测试,8MB的xml文件解析完毕用时11.2秒
- DOM4J的解析、创建、修改(资料部分转载)
- java xml dom4j 创建 修改 解析
- OVS的学习理解(部分修改,部分转载引用)
- java中利用dom4j对XML文档的创建、解析、查找、修改、保存等操作。
- java中利用dom4j对XML文档的创建、解析、查找、修改、保存等操作。
- 基于dom4j的xml创建与解析
- dom4j 创建,解析xml
- dom4j解析xml,dom4j创建xml
- dom4j资料(转帖)
- dom4j解析和修改xml
- DOM4J创建和修改XML
- 使用 dom4j 创建 修改 XML
- java解析xml字符串(用dom4j) (转载)
- dom4j生成、解析、修改xml的简单操作
- DOM、JDOM、DOM4J的区别(转载)
- Dom4j创建和解析XML
- Dom4J方式创建/解析xml
- DOM4J 解析xml,创建xml
- Core Animation之多种动画效果
- ehcache的使用
- GRUB启动分析之stage1
- smarty
- Struts2与Freemarker生成xml文本
- DOM4J的解析、创建、修改(资料部分转载)
- 最伟大的程序员Richard Stallman主页
- 将表空间、数据文件从ASM迁移到文件系统
- ubuntu server 安装 Nginx+PHP5 (PHP-FPM) +MySQL
- “骑驴找马”被上司发现了,怎么办?
- linux C 获取日期时间
- IT大败局----第一章 追求“卓越”的失败
- memcache的相关问答
- configure检测依赖项的一个问题