`

Dom4j创建修改格式化解析XML文件及中文处理(转)

阅读更多

本文主要讨论了用dom4j解析XML的基础问题,包括建立XML文档,添加、修改、删除节点,以及格式化(美化)输出和中文问题。可作为dom4j的入门资料。

1. 下载与安装

dom4j是sourceforge.net上的一个开源项目,主要用于对XML的解析。从2001年7月发布第一版以来,已陆续推出多个版本,目前最高版本为1.5。
dom4j专门针对Java开发,使用起来非常简单、直观,在Java界,dom4j正迅速普及。

可以到
http://sourceforge.net/projects/dom4j下载其最新版。

dom4j1.5的完整版大约13M,是一个名为dom4j-1.5.zip的压缩包,解压后有一个dom4j-1.5.jar文件,这就是应用时需要引入的类包,另外还有一个jaxen-1.1-beta-4.jar文件,一般也需要引入,否则执行时可能抛java.lang.NoClassDefFoundError: org/jaxen/JaxenException异常,其他的包可以选择用之。

2. 示例XML文档(holen.xml)

为了述说方便,先看一个XML文档,之后的操作均以此文档为基础。

  1. holen.xml 
  2. <?xml version="1.0" encoding="UTF-8"?>
  3. <books>
  4.     <!--This is a test for dom4j, holen, 2004.9.11-->
  5.     <book show="yes">
  6.        <title>Dom4j Tutorials</title>
  7.     </book>
  8.     <book show="yes">
  9.        <title>Lucene Studing</title>
  10.     </book>
  11.     <book show="no">
  12.        <title>Lucene in Action</title>
  13.     </book>
  14.     <owner>O'Reilly</owner>
  15. </books>

这是一个很简单的XML文档,场景是一个网上书店,有很多书,每本书有两个属性,一个是书名[title],一个为是否展示[show],最后还有一项是这些书的拥有者[owner]信息。

3. 建立一个XML文档

  1. /**
  2.      * 建立一个XML文档,文档名由输入属性决定
  3.      * @param filename 需建立的文件名
  4.      * @return 返回操作结果, 0表失败, 1表成功
  5.      */
  6.     public int createXMLFile(String filename){
  7.        /** 返回操作结果, 0表失败, 1表成功 */
  8.        int returnValue = 0;
  9.        /** 建立document对象 */
  10.        Document document = DocumentHelper.createDocument();
  11.        /** 建立XML文档的根books */
  12.        Element booksElement = document.addElement("books");
  13.        /** 加入一行注释 */
  14.        booksElement.addComment("This is a test for dom4j, holen, 2004.9.11");
  15.        /** 加入第一个book节点 */
  16.        Element bookElement = booksElement.addElement("book");
  17.        /** 加入show属性内容 */
  18.        bookElement.addAttribute("show","yes");
  19.        /** 加入title节点 */
  20.        Element titleElement = bookElement.addElement("title");
  21.        /** 为title设置内容 */
  22.        titleElement.setText("Dom4j Tutorials");
  23.        
  24.        /** 类似的完成后两个book */
  25.        bookElement = booksElement.addElement("book");
  26.        bookElement.addAttribute("show","yes");
  27.        titleElement = bookElement.addElement("title");
  28.        titleElement.setText("Lucene Studing");
  29.        bookElement = booksElement.addElement("book");
  30.        bookElement.addAttribute("show","no");
  31.        titleElement = bookElement.addElement("title");
  32.        titleElement.setText("Lucene in Action");
  33.        
  34.        /** 加入owner节点 */
  35.        Element ownerElement = booksElement.addElement("owner");
  36.        ownerElement.setText("O'Reilly");
  37.        
  38.        try{
  39.            /** 将document中的内容写入文件中 */
  40.            XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)));
  41.            writer.write(document);
  42.            writer.close();
  43.            /** 执行成功,需返回1 */
  44.            returnValue = 1;
  45.        }catch(Exception ex){
  46.            ex.printStackTrace();
  47.        }
  48.               
  49.        return returnValue;
  50.     }

说明:
Document document = DocumentHelper.createDocument();
通过这句定义一个XML文档对象。

Element booksElement = document.addElement("books");
通过这句定义一个XML元素,这里添加的是根节点。
Element有几个重要的方法:
l         addComment:添加注释
l         addAttribute:添加属性
l         addElement:添加子元素

最后通过XMLWriter生成物理文件,默认生成的XML文件排版格式比较乱,可以通过OutputFormat类的createCompactFormat()方法或createPrettyPrint()方法格式化输出,默认采用createCompactFormat()方法,显示比较紧凑,这点将在后面详细谈到。

生成后的holen.xml文件内容如下:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <books><!--This is a test for dom4j, holen, 2004.9.11--><book show="yes"><title>Dom4j Tutorials</title></book><book show="yes"><title>Lucene Studing</title></book><book show="no"><title>Lucene in Action</title></book><owner>O'Reilly</owner></books>

4. 修改XML文档

有三项修改任务,依次为:
l         如果book节点中show属性的内容为yes,则修改成no
l         把owner项内容改为Tshinghua,并添加date节点
l         若title内容为Dom4j Tutorials,则删除该节点

  1.    /**
  2.      * 修改XML文件中内容,并另存为一个新文件
  3.      * 重点掌握dom4j中如何添加节点,修改节点,删除节点
  4.      * @param filename 修改对象文件
  5.      * @param newfilename 修改后另存为该文件
  6.      * @return 返回操作结果, 0表失败, 1表成功
  7.      */
  8.     public int ModiXMLFile(String filename,String newfilename){
  9.        int returnValue = 0;
  10.        try{
  11.            SAXReader saxReader = new SAXReader(); 
  12.            Document document = saxReader.read(new File(filename));
  13.            /** 修改内容之一: 如果book节点中show属性的内容为yes,则修改成no */
  14.            /** 先用xpath查找对象 */
  15.            List list = document.selectNodes("/books/book/@show" ); 
  16.            Iterator iter = list.iterator();
  17.            while(iter.hasNext()){
  18.               Attribute attribute = (Attribute)iter.next();
  19.               if(attribute.getValue().equals("yes")){
  20.                   attribute.setValue("no");
  21.               }   
  22.            }
  23.            
  24.            /**
  25.             * 修改内容之二: 把owner项内容改为Tshinghua
  26.             * 并在owner节点中加入date节点,date节点的内容为2004-09-11,还为date节点添加一个属性type
  27.             */
  28.            list = document.selectNodes("/books/owner" );
  29.            iter = list.iterator();
  30.            if(iter.hasNext()){
  31.               Element ownerElement = (Element)iter.next();
  32.               ownerElement.setText("Tshinghua");
  33.               Element dateElement = ownerElement.addElement("date");
  34.               dateElement.setText("2004-09-11");
  35.               dateElement.addAttribute("type","Gregorian calendar");
  36.            }
  37.            
  38.            /** 修改内容之三: 若title内容为Dom4j Tutorials,则删除该节点 */
  39.            list = document.selectNodes("/books/book");
  40.            iter = list.iterator();
  41.            while(iter.hasNext()){
  42.               Element bookElement = (Element)iter.next();
  43.               Iterator iterator = bookElement.elementIterator("title");
  44.               while(iterator.hasNext()){
  45.                   Element titleElement=(Element)iterator.next();
  46.                   if(titleElement.getText().equals("Dom4j Tutorials")){
  47.                      bookElement.remove(titleElement);
  48.                   }
  49.               }
  50.            }          
  51.            
  52.            try{
  53.               /** 将document中的内容写入文件中 */
  54.               XMLWriter writer = new XMLWriter(new FileWriter(new File(newfilename)));
  55.               writer.write(document);
  56.               writer.close();
  57.               /** 执行成功,需返回1 */
  58.               returnValue = 1;
  59.            }catch(Exception ex){
  60.               ex.printStackTrace();
  61.            }
  62.            
  63.        }catch(Exception ex){
  64.            ex.printStackTrace();
  65.        }
  66.        return returnValue;
  67.     }
  68.      

说明:
List list = document.selectNodes("/books/book/@show" );
list = document.selectNodes("/books/book");
上述代码通过xpath查找到相应内容。

通过setValue()、setText()修改节点内容。

通过remove()删除节点或属性。

5. 格式化输出和指定编码

默认的输出方式为紧凑方式,默认编码为UTF-8,但对于我们的应用而言,一般都要用到中文,并且希望显示时按自动缩进的方式的显示,这就需用到OutputFormat类。


  1.     /**
  2.      * 格式化XML文档,并解决中文问题
  3.      * @param filename
  4.      * @return
  5.      */
  6.     public int formatXMLFile(String filename){
  7.        int returnValue = 0;
  8.        try{
  9.            SAXReader saxReader = new SAXReader(); 
  10.            Document document = saxReader.read(new File(filename));
  11.            XMLWriter writer = null;
  12.            /** 格式化输出,类型IE浏览一样 */
  13.            OutputFormat format = OutputFormat.createPrettyPrint();
  14.            /** 指定XML编码 */
  15.            format.setEncoding("GBK");
  16.            writer= new XMLWriter(new FileWriter(new File(filename)),format);
  17.            writer.write(document);
  18.            writer.close();      
  19.            /** 执行成功,需返回1 */
  20.            returnValue = 1;     
  21.        }catch(Exception ex){
  22.            ex.printStackTrace();
  23.        }
  24.        return returnValue;
  25.     }

说明:

OutputFormat format = OutputFormat.createPrettyPrint();
这句指定了格式化的方式为缩进式,则非紧凑式。

format.setEncoding("GBK");
指定编码为GBK。

XMLWriter writer = new XMLWriter(new FileWriter(new File(filename)),format);
这与前面两个方法相比,多加了一个OutputFormat对象,用于指定显示和编码方式。

6. 完整的类代码

前面提出的方法都是零散的,下面给出完整类代码。

  1. Dom4jDemo.java 
  2. package com.holen.dom4j;

  3. import java.io.File;
  4. import java.io.FileWriter;
  5. import java.util.Iterator;
  6. import java.util.List;

  7. import org.dom4j.Attribute;
  8. import org.dom4j.Document;
  9. import org.dom4j.DocumentHelper;
  10. import org.dom4j.Element;
  11. import org.dom4j.io.OutputFormat;
  12. import org.dom4j.io.SAXReader;
  13. import org.dom4j.io.XMLWriter;

  14. //如果是UTF-8 FileWriter 改用 FileOutputStream 
  15. public class Dom4jDemo{
  16.   public Dom4jDemo (){}
   public static void main (String[] args){
          Dom4jDemo temp = new Dom4jDemo();
         temp.createXMLFile("D:/beans.xml");
         temp.ModiXMLFile("D:/beans.xml","D:/beans1.xml");
          temp.formatXMLFile("D:/beans1.xml");
      }
  1. }

 

分享到:
评论

相关推荐

    YOLOv10实时端到端目标检测.zip

    python、yolo、pytorch

    网络安全是指通过技术、管理和法律手段保护网络系统、数据及用户隐私,防止未经授权的访问、攻击和信息泄露,确保可用性、完整性和机密性

    网络安全是通过技术手段、管理策略和法律规范,保护网络系统、数据及用户隐私免受未经授权的访问、攻击或泄露,确保网络服务的可用性、数据的完整性和机密性。其核心内容包括: 1. 技术防护:如防火墙、入侵检测系统(IDS)、加密通信、漏洞修复等。 2. 管理措施:包括安全策略制定、访问控制、安全审计、应急响应等。 3. 法律与合规:遵循《网络安全法》《数据安全法》等法规,保障用户隐私与国家安全。 4. 安全意识:提升用户对钓鱼攻击、密码安全等风险的防范能力。 # 适用人群 - 企业/组织:IT运维人员、安全管理员、开发工程师(需保障业务系统安全)。 - 普通用户:需防范个人信息泄露、网络诈骗等风险。 - 政府与公共部门:确保关键基础设施(如电力、金融、通信)的安全运行。 - 教育领域:学生及教师需了解基础安全知识以应对网络威胁。 # 适用场景及目标 1. 企业场景: - 目标:防御黑客攻击、数据泄露、勒索软件等,保障业务连续性。 - 措施:部署网络隔离、多因素认证、定期渗透测试。 2

    2025年DeepSeek引发广泛关注,大模型应用落地将加速.pdf

    人工智能、大语言模型相关学习资料

    基于C#的调用今日头条API并写入数据库 源码.zip

    需要将源码中的key换成正式的key方可使用

    图像处理_TF-Slim_卫星图像分类_训练模型_1741783746.zip

    图像处理项目实战

    jaxlib-0.4.18-cp312-cp312-win_amd64.whl

    该资源为jaxlib-0.4.18-cp312-cp312-win_amd64.whl,欢迎下载使用哦!

    物联网_Android_Things_车牌识别_HyperLPR4Android_边缘计算.zip

    车牌识别项目

    智慧停车_云计算_C_C_Linux_QT_OpenCV_E_1741774510.zip

    车牌识别项目

    生物医学_清测康居家心率体温检测设备_智能监测_1741166755.zip

    Arduino项目

    小微智慧园区数字化建设方案PPT(35页).pptx

    在当今数字化浪潮中,园区智慧化建设正成为推动区域经济发展和产业转型升级的关键力量。这份园区智慧化解决方案全面展示了如何通过集成大数据、云计算、物联网(IoT)、人工智能(AI)、地理信息系统(GIS)和建筑信息模型(BIM)等前沿技术,为传统产业园区插上数字的翅膀,打造“数字创新”产业园区。 数字技术赋能,重塑园区生态 传统产业园区往往面临运营效率低下、管理粗放、资源利用率不高等问题。而通过智慧化改造,园区可以实现从“清水房”到“精装房”的华丽蜕变。数字化技术不仅提升了园区的运营管理水平,降低了运营成本,还显著增强了园区的竞争力和吸引力。例如,通过构建园区数字模型(CIM),实现了多规数据融合,形成了园区规划“一张图”,为园区管理提供了直观、高效的可视化工具。此外,智能感知设施的应用,如环境监测、能耗监测等,让园区管理更加精细化、科学化。智慧能源管理系统通过实时监测和智能分析,帮助园区实现低碳绿色发展,而综合安防管控系统则通过AI+视频融合技术,为园区安全保驾护航。更有趣的是,这些技术的应用还让园区服务变得更加个性化和便捷,比如园区移动APP,让企业和员工可以随时随地享受园区服务,从会议室预定到智慧公寓管理,一切尽在“掌”握。 智慧运营中心,打造园区大脑 园区智慧化建设的核心在于构建智慧运营中心,这可以看作是园区的“数字大脑”。通过集成物联网服务平台、大数据分析平台、应用开发赋能平台等核心支撑平台,智慧运营中心实现了对园区内各类数据的实时采集、处理和分析。在这个“大脑”的指挥下,园区管理变得更加高效、协同。比如,建设工程项目智慧监管系统,通过基于二三维GIS底图的统一数字化监管,实现了对园区在建工程项目的进度控制、质量控制和安全控制的全方位监管。可视化招商系统则利用CIM模型,以多种方式为园区对外招商推介提供了数字化、在线化的展示窗口。而产业经济分析系统,则通过挖掘和分析产业数据,为园区产业发展提供了有力的决策支持。智慧运营中心的建设,不仅提升了园区的整体运营水平,还为园区的可持续发展奠定了坚实基础。 产业服务升级,激发创新活力 园区智慧化建设不仅关注基础设施和运营管理的升级,更重视产业服务的创新。通过整合平台资源、园区本地资源和外围资源,打造园区服务资源池,为园区内的企业和个人提供了全面的智慧管理、智慧工作和智慧生活服务。特别是工业互联网平台和工业云服务的建设,为园区内的企业提供了轻量化、智能化的生产服务。这些服务涵盖了车间信息化管理、云制造执行、云智能仓储、设备健康管理等多个方面,有效提升了企业的生产效率和竞争力。此外,通过产业经济分析系统,园区还能够对潜在客户进行挖掘、对经销商进行风控、对产品销量进行预测等,为企业的市场营销提供了有力支持。这些创新的产业服务,不仅激发了园区的创新活力,还为区域经济的转型升级注入了新的动力。总之,园区智慧化建设是一场深刻的变革,它正以前所未有的方式重塑着园区的生态、运营和服务模式,为园区的可持续发展开辟了广阔的前景。

    地理信息系统中4326与3857坐标系的特性及其应用场景解析

    内容概要:本文对比了EPSG:4326(WGS 84)坐标系和EPSG:3857(Web Mercator)坐标系的主要特征。4326是一种基于经度和纬度的地理坐标系统(GCS),它的坐标用度作为单位,在地理定位方面有较高准确性。相比之下,3857属于一种投影坐标系统(PCS), 该系统内的坐标用平面直角坐标的X/Y轴以米为单位进行测量,在线地图应用领域尤为普及,但是,在高维度的两极地区则会存在一定的失真。 适用人群:对地理信息系统(GIS)、地图制图以及空间数据有兴趣的技术人员和爱好者。 使用场景及目标:帮助读者明白这两种不同坐标系统的特性和优缺点,以便于正确选择适当的坐标系以满足各种空间数据分析和服务需求,比如创建精准的全球定位系统应用程序或者开发高质量的地图展示网站。 其他说明:理解这两者的区别对于确保地理位置数据准确转换及呈现至关重要。无论是从事地图制作还是相关软件的开发者都需要熟悉这两个坐标系的基础知识。

    这是一个yolo3keras的源码可以用于训练自己的模型.zip

    python、yolo、pytorch

    图像识别_PyTorch_宠物分类_网页应用_1741785391.zip

    图像处理项目实战

    识别车牌的一个小demo.zip

    车牌识别

    小程序 礼物说2.4.2 后台模块+前端小程序源码.zip

    源码介绍 更新动态: 版本号:2.4.2 – 礼物说 修复商品下架前端还显示的问题 版本号:2.4.1 – 礼物说 前端分类更新 版本号:2.3 – 礼物说 更改授权方式 版本号:2.2 – 礼物说 修复送给好友礼物,好友不显示的问题

    机器视觉—AI算法模型介绍.pdf

    人工智能、大语言模型相关学习资料

    OpenRAG:通过上下文检索学习端到端优化RAG

    随着大型语言模型(LLMs) (Zhao et al. 2023; Minaee et al. 2024) 的规模扩大,它们面临着数据瓶颈问题,高质量的互联网数据无法满足日益增长的训练需求。与此同时,下游数据量迅速增加,但由于其实时可用性 (Lei Wang et al. 2024; X.-Y. Liu, Wang, and Zha 2023) 、隐私问题 (Arora et al. 2023) 、许可限制 (Min et al. 2024) 和伦理问题 (Serouis and Sèdes 2024; Ayyamperumal and Ge 2024) ,这些数据通常无法用于预训练。 检索增强生成(RAG) (Lewis et al. 2020; Guu et al. 2020; Gao et al. 2023) 成为解决这一挑战的有希望的方法。RAG 不仅依赖精心整理的互联网数据,还利用信息检索(IR)从外部来源获取相关数据,并将其作为上下文以提高生成质量。这在 RAG 中非常有价值,因为它可以使用快速扩展但通常无法访问的下游数据,这些数据比经过大量处理和严

    基于springboot oracle java-swing 的 职工考勤管理信息系统

    oracle 基于springboot oracle java-swing 的 职工考勤管理信息系统

    清华大学第七弹:DeepSeek助力新时代家庭教育智能化解决方案:从理论到实践

    内容概要:这份由清华大学联合人工智能学院发布、涵盖90页的专业报告,全面介绍了如何利用DeepSeek等人工智能工具赋能家庭教育。报告从当前家长辅导时间与精力有限、能力不足及其引发的心理和人际关系困扰的实际背景出发,探讨了AI家庭教育的独特优势,并具体阐述了如何通过DeepSeek解决教育中的诸多痛点。报告不仅涵盖了AI辅助工具的基本功能介绍,还包括详细的分步骤实践指南。同时探讨了未来职业技能规划、AI伦理及其对孩子全面发展的重要性。此外,特别提到了如何在不同场景(如作业辅导、作文批改、情感疏导)中合理、高效使用DeepSeek,并展示了通过定制化学习路径培养创造力、数字素养和其他未来竞争所需的多项核心技能的成功案例。该报告不仅适合对AI应用于教育感兴趣的家长,还为希望了解前沿教育科技的研究者提供了有益的参考。 适用人群:希望借助人工智能改善子女教育质量和效率的家长;教育工作者,包括一线教师、培训机构教师;研究人员,尤其是致力于家庭教育技术和心理学领域研究的专业人士。 使用场景及目标:家长可通过本指南学习如何充分利用人工智能工具为孩子提供个性化的辅导和支持;教育从业者和研究人员可以借鉴

    (源码)基于Arduino的RFID门禁系统.zip

    # 基于Arduino的RFID门禁系统 ## 项目简介 本项目是一个基于Arduino的全面RFID门禁系统,旨在实现安全的访问控制。系统使用MFRC522 RFID读取模块、用于控制门锁机制的伺服电机,以及LED和蜂鸣器为用户提供反馈,确保可靠且便捷的访问管理。 ## 项目的主要特性和功能 1. RFID认证系统读取RFID卡的唯一标识符(UID),并与预定义的授权ID列表进行验证。 2. 伺服电机控制伺服电机控制门的物理锁定机制,根据访问授权进行锁定或解锁操作。 3. 视觉和听觉反馈LED和蜂鸣器提供清晰的视觉和听觉指示,表明访问状态,提升用户体验。 4. 模块化和可定制性代码和硬件设置易于修改或扩展,可添加如键盘或生物识别传感器等额外功能。 ## 安装使用步骤 ### 步骤1收集组件 Arduino开发板(如Arduino Uno) MFRC522 RFID读取模块 伺服电机 LED和电阻 无源蜂鸣器 跳线

Global site tag (gtag.js) - Google Analytics