XML文件的写入和读取(解析)基于DOM4J工具

这两天做了个天气的小应用,需要用到百度的天气api,获取到的信息是一个xml文档。

所以就从网上查了一下相关的知识,就是关于怎么去解析出来xml文件的信息。

先放一个我自己写的例子,加了点注释,贴这里吧。

package cn.yzy.test;import java.util.List;import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.Iterator;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 MyTest {/*** DOM4J读写XML示例*/public static void main(String[] args) {// 用变量保存一下xml文件的路径String path = "d:\\temp\\student.xml";// 创建xml的方法createXML(path);// 读取xml文件的方法readXML(path);// 把xml文件读取成StringString xml = readFile(path);// 输出一下xmlSystem.out.println(xml);// 把String的xml解析出来readXMLStr(xml);}/*** readFile 读取文件到String* * @param path* @return*/public static String readFile(String path) {String txt = "";try {// 读取文件File file = new File(path);// 创建输入流InputStreamReader isReader = new InputStreamReader(new FileInputStream(file), "utf-8");// 缓冲区BufferedReader bf = new BufferedReader(isReader);// 循环把文本读取出来String lineTxt = null;while ((lineTxt = bf.readLine()) != null) {txt += lineTxt;}} catch (Exception e) {e.printStackTrace();}// 最后把文本字符串返回return txt;}/*** createXML 创建XML到指定目录* * @param path*/public static void createXML(String path) {// 读取文件,检查文件是否存在,存在就不创建文件了。File file = new File(path);if (!file.exists()) {try {// 创建xml文档,用DocumentHelperDocument dc = DocumentHelper.createDocument();// 在文档里要加入元素节点// 添加 根节点 -> 学生信息Element root = dc.addElement("学生信息");// 在 学生信息节点 中 加入 学生Element stu1 = root.addElement("学生");// 可以设置属性,设置学生 sid 属性为 001stu1.addAttribute("sid", "001");// 在学生里面加入子元素,键值对应Element name1 = stu1.addElement("姓名");name1.setText("张三");Element sex1 = stu1.addElement("性别");sex1.setText("男");Element stu2 = root.addElement("学生");stu2.addAttribute("sid", "002");Element name2 = stu2.addElement("姓名");name2.setText("小红");Element sex2 = stu2.addElement("性别");sex2.setText("女");// xml文档生成,准备写入文件,文件路径和格式设置好。// 输出格式以及编码设置OutputFormat format = new OutputFormat("\n", true);format.setEncoding("utf-8");// 声明一个写文件的类XMLWriter writer = new XMLWriter(new FileOutputStream(path),format);// 写文件,完成后关闭writer.write(dc);writer.close();System.out.println("操作成功");} catch (IOException e) {e.printStackTrace();}} else {System.out.println("文件已存在");}}/*** readXML 读取XML,从指定文件路径* * @param path*/public static void readXML(String path) {try {// 输出文件是否存在System.out.println(new File(path).exists());// 新建一个读取xml文档的对象SAXReader reader = new SAXReader();// 将文件读入DocumentDocument dc = reader.read(path);System.out.println(dc.toString());// 读取根节点Element root = dc.getRootElement();// 遍历根节点下,所有子节点(仅能访问到一层)List nodes = root.elements();for (Iterator it = nodes.iterator(); it.hasNext();) {Element ele = (Element) it.next();System.out.println(ele.getName() + ele.attributeValue("sid"));System.out.println(ele.elementText("姓名"));System.out.println(ele.elementText("性别"));}} catch (DocumentException e) {e.printStackTrace();}System.out.println("--- --- End --- ---");}/*** readXMLStr 从String中读取XML信息* * @param xml*/public static void readXMLStr(String xml) {try {System.out.println("--- --- readXMLStr --- ---");// 同样是创建读取xml的类,但是读取方法参数改为:new StringReader(xml) 从字符串读取SAXReader reader = new SAXReader();Document dc = reader.read(new StringReader(xml));System.out.println(dc.toString());Element root = dc.getRootElement();List nodes = root.elements();for (Iterator it = nodes.iterator(); it.hasNext();) {Element ele = (Element) it.next();System.out.println(ele.getName() + ele.attributeValue("sid"));System.out.println(ele.elementText("姓名"));System.out.println(ele.elementText("性别"));}} catch (DocumentException e) {e.printStackTrace();}System.out.println("--- --- End --- ---");}
}


以下是我从其他一个博客里参考的一些资料,深受启发:


网址:

http://www.blogjava.net/biiau/archive/2008/09/24/231005.html


部分DOM4J的解释


一.Document对象相关


1.读取XML文件,获得document对象.
       SAXReader reader = new SAXReader();
      Document   document = reader.read(new File("input.xml"));


2.解析XML形式的文本,得到document对象.
      String text = "<members></members>";
      Document document = DocumentHelper.parseText(text);


3.主动创建document对象.
       Document document = DocumentHelper.createDocument();
      Element root = document.addElement("members");// 创建根节点


二.节点相关


1.获取文档的根节点.
      Element rootElm = document.getRootElement();


2.取得某节点的单个子节点.
     Element memberElm=root.element("member");// "member"是节点名


3.取得节点的文字
     String text=memberElm.getText();
也可以用:
     String text=root.elementText("name");
这个是取得根节点下的name字节点的文字.


4.取得某节点下名为"member"的所有字节点并进行遍历.
List nodes = rootElm.elements("member");


for (Iterator it = nodes.iterator(); it.hasNext();) {
    Element elm = (Element) it.next();
   // do something
}


5.对某节点下的所有子节点进行遍历.
 for(Iterator it=root.elementIterator();it.hasNext();){
                 Element element = (Element) it.next();
                // do something
             }


6.在某节点下添加子节点.
Element ageElm = newMemberElm.addElement("age");


7.设置节点文字.
ageElm.setText("29");


8.删除某节点.
parentElm.remove(childElm);// childElm是待删除的节点,parentElm是其父节点


9.添加一个CDATA节点.
          Element contentElm = infoElm.addElement("content");
         contentElm.addCDATA(diary.getContent());


            contentElm.getText(); // 特别说明:获取节点的CDATA值与获取节点的值是一个方法
            contentElm.clearContent(); //清除节点中的内容,CDATA亦可




三.属性相关.
1.取得某节点下的某属性
             Element root=document.getRootElement();    
             Attribute attribute=root.attribute("size");// 属性名name


2.取得属性的文字
             String text=attribute.getText();
也可以用:
String text2=root.element("name").attributeValue("firstname");
这个是取得根节点下name字节点的属性firstname的值.


3.遍历某节点的所有属性
  Element root=document.getRootElement();    
            for(Iterator it=root.attributeIterator();it.hasNext();){
                 Attribute attribute = (Attribute) it.next();
                 String text=attribute.getText();
                 System.out.println(text);
             }


4.设置某节点的属性和文字.
newMemberElm.addAttribute("name", "sitinspring");


5.设置属性的文字
             Attribute attribute=root.attribute("name");
             attribute.setText("sitinspring");


6.删除某属性
              Attribute attribute=root.attribute("size");// 属性名name
             root.remove(attribute);


四.将文档写入XML文件.
1.文档中全为英文,不设置编码,直接写入的形式.
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(document);
writer.close();


2.文档中含有中文,设置编码格式写入的形式.
              OutputFormat format = OutputFormat.createPrettyPrint();
             format.setEncoding("GBK");    // 指定XML编码        
             XMLWriter writer = new XMLWriter(new FileWriter("output.xml"),format);
            
             writer.write(document);
             writer.close();


五.字符串与XML的转换
1.将字符串转化为XML
String text = "<members> <member>sitinspring</member> </members>";
Document document = DocumentHelper.parseText(text);


2.将文档或节点的XML转化为字符串.
             SAXReader reader = new SAXReader();
             Document   document = reader.read(new File("input.xml"));            
             Element root=document.getRootElement();                
             String docXmlText=document.asXML();
             String rootXmlText=root.asXML();
             Element memberElm=root.element("member");
             String memberXmlText=memberElm.asXML();


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Google Guava,牛逼的脚手架

01、前世今生你好呀&#xff0c;我是 Guava。1995 年的时候&#xff0c;我的“公明”哥哥——Java 出生了。经过 20 年的发展&#xff0c;他已经成为世界上最流行的编程语言了&#xff0c;请允许我有失公允的把“之一”给去了。虽然他时常遭受着各种各样的吐槽&#xff0c;但他…

ruby 将字符转数字计算_Ruby程序计算一个数字中的位数

ruby 将字符转数字计算计算位数 (Counting the number of digits) Ruby does not provide you any predefined direct method through which you can find the number of digits in a number. Though one method can be implemented by converting the number into a string an…

python_L2_operator

1. i/j – division – if both are ints, result is int, represen9ng quo9ent without remainder e.g. 3/2 1 3.0/2 1.5  but   -3/2 -2 2. --2 >>> 2 3. a * 2 >>> aa 4 . abc[-1] returns c 5. world[:-1] returns worl转载于:https://www.cnbl…

Android Call requires API level 11 (current min is 8)的解决方案

【错误描述】 在用Eclipse开发过程中&#xff0c;为了兼容Android2.2和4.0以上版本&#xff0c;我在使用Notification类时做了2个版本的代码&#xff0c;代码根据系统版本不同执行相应模块&#xff0c;结果&#xff0c;等我输完代码&#xff0c;发现系统提示了一个这么的错误。…

阿里巴巴Druid,轻松实现MySQL数据库加密!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;为什么要加密&#xff1f;现在的开发习惯&#xff0c;无论是公司的项目还是个人的项目&#xff0c;都会选择将源码上传到 Gi…

计算机图形学图形旋转_计算机图形学中的平板显示

计算机图形学图形旋转平板显示器 (Flat Panel Display) It is generally known as FPD, the flat-panel display is such a display technology which overtakes Cathode Ray Tube as a new standard of computer desktop displays. Unlike monitors through CRT, flat-panel d…

一文掌握Redisson分布式锁原理|干货推荐

ReentrantLock 重入锁在说 Redisson 之前我们先来说一下 JDK 可重入锁: ReentrantLockReentrantLock 保证了 JVM 共享资源同一时刻只允许单个线程进行操作实现思路ReentrantLock 内部公平锁与非公平锁继承了 AQS[AbstractQueuedSynchronizer]1、AQS 内部通过 volatil 修饰的 in…

android创建文件夹和文件的一些经验教训

这几天做一个功能需要在手机上创建一个文件夹&#xff0c;然后往里面存储一些文件&#xff0c;首先得考虑用户有没有sdcard&#xff0c;如果有就在sdcard上创建一个指定的文件夹&#xff0c;如果没有则在你的工程所在的目录“/data/data/你的包名”下创建文件夹。用到的方法是&…

7种分布式事务的解决方案,一次讲给你听

本文约5300字&#xff0c;阅读时长「5分钟」什么是分布式事务分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器「分别位于不同的分布式系统的不同节点之上」。一个大的操作由N多的小的操作共同完成。而这些小的操作又分布在不同的服务上。针对于这些操…

js中的转译_JavaScript中的填充和转译

js中的转译JavaScript is rapidly advancing. Today its the most popular programming/scripting language that devs use to code logic and applications and is used in umpteen number of places. The community behind its development hasnt stopped creating and addin…

css @media 响应式布局

2019独角兽企业重金招聘Python工程师标准>>> &#xfeff;1、在 html 标签中 <link rel"stylesheet" type"text/css" href"style1.css" media"screen and (min-width: 600px) and (max-width: 800px)"> 2、在样式表中…

Apache JK Tomcat 集群问题

2019独角兽企业重金招聘Python工程师标准>>> 这几天被集群并发问题快折腾死了&#xff0c;望哪位高人看下到底是哪里出现了问题。 Apache Server是正常的&#xff0c;各服务器的Tomcat 也是正常的&#xff0c;但当Apache的连接数达到 300左右的时候&#xff0c;JK就…

Redis实现分布式锁的7种方案,及正确使用姿势!

种方案前言日常开发中&#xff0c;秒杀下单、抢红包等等业务场景&#xff0c;都需要用到分布式锁。而Redis非常适合作为分布式锁使用。本文将分七个方案展开&#xff0c;跟大家探讨Redis分布式锁的正确使用方式。如果有不正确的地方&#xff0c;欢迎大家指出哈&#xff0c;一起…

c#中的long类型示例_C#中带示例的无符号字节数组

c#中的long类型示例C&#xff03;中的无符号字节数组 (Unsigned Byte Array in C#) In C#.Net, we can create an unsigned byte array by using byte, byte is used to store only positive values between the range of 0 to 255 (Unsigned 8 bits integer). 在C&#xff03;…

Android软件开发之盘点所有Dialog对话框大合集(一)

转&#xff1a;http://xys289187120.blog.51cto.com/3361352/657562/ 雨松MOMO带大家盘点Android 中的对话框 今天我用自己写的一个Demo 和大家详细介绍一个Android中的对话框的使用技巧。 1.确定取消对话框 对话框中有2个按钮 通过调用 setPositiveButton 方法 和 setNegat…

JDK 9 对字符串 String 的优化,挺有意思!

String类可以说是Java编程中使用最多的类了&#xff0c;如果能对String字符串的性能进行优化&#xff0c;那么程序的性能必然能大幅提升。这不JDK9就对String字符串进行了改进升级&#xff0c;在某些场景下可以让String字符串内存减少一半&#xff0c;进而减少JVM的GC次数。Str…

PHP将数组存入数据库中的四种方式

PHP将数组存入数据库中的四种方式 最近突然遇到了一个问题&#xff0c;如何用PHP将数组存入到数据库中&#xff0c;经过自己的多方查找和研究&#xff0c;总结了以下四种方法&#xff1a;1.implode()和explode()方式2.print_r()和自定义函数方式3.serialize()和unserialize()方…

c#中.clear()作用_清单 .Clear()方法以及C#中的示例

c#中.clear()作用C&#xff03;List <T> .Clear()方法 (C# List<T>.Clear() Method) List<T>.Clear() method is used to clear the list, it remove all elements from the list. List <T> .Clear()方法用于清除列表&#xff0c;它从列表中删除所有元…

Android开发:利用Activity的Dialog风格完成弹出框设计

转&#xff1a;http://www.linuxidc.com/Linux/2011-08/41933.htm 在我们使用Dialog时&#xff0c;如果需要用到很多自己设计的控件&#xff0c;虽然可以让弹出框显示出我们需要的界面&#xff0c;但却无法找到地方完成控制代码的编写&#xff0c;如何解决这个问题呢,我们可以将…

Java中实现定时任务的3种方法!

今天我们不用任何框架&#xff0c;用最朴素的 Java API 来实现定时任务&#xff0c;本文会介绍 3 种实现方案&#xff0c;我们一起来看...1、 sleep 这也是我们最常用的 sleep 休眠大法&#xff0c;不只是当作休眠用&#xff0c;我们还可以利用它很轻松的能实现一个简单的定时任…