首页 > 其他分享 >XML文件的写入和读取(解析)基于DOM4J工具

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

时间:2022-11-20 21:10:37浏览次数:70  
标签:XML xml 读取 DOM4J Element new root 节点 String


这两天做了个天气的小应用,需要用到百度的天气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文件读取成String
String xml = readFile(path);
// 输出一下xml
System.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文档,用DocumentHelper
Document dc = DocumentHelper.createDocument();
// 在文档里要加入元素节点
// 添加 根节点 -> 学生信息
Element root = dc.addElement("学生信息");
// 在 学生信息节点 中 加入 学生
Element stu1 = root.addElement("学生");
// 可以设置属性,设置学生 sid 属性为 001
stu1.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();
// 将文件读入Document
Document 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();


标签:XML,xml,读取,DOM4J,Element,new,root,节点,String
From: https://blog.51cto.com/yuzhyn/5872011

相关文章

  • C# 读取照片的EXIF信息
    一、使用MetadataExtractor读取EXIF信息1、NuGet中安装在NuGet中搜索并安装MetadataExtractor;2、包信息我安装后会有两个包:MetadataExtractor2.0.0和XmpCore5.1......
  • MysSQL如何高效地随机读取数据,
    MysSQL如何高效地随机读取数据  现在有个需求,需要从mysql中随机读取出100条认证企业的数据,每一次读取的数据均不同?      可能很多人会联想到orderbyran......
  • 3.读取CSV文件并进行可视化处理
    importcsvimportmatplotlib.pyplotaspltfromdatetimeimportdatetimeplt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签plt.rcParams['axes.un......
  • MAUI新生1.4-XAML语法基础:x命名空间xmlns:x
    x命名空间,又叫XAML命名空间,作用于XAML的编译过程。我们知道,XAML代码,最终通过XAML编译器,编译为中间代码IL,并与后台C#代码的编译结果合并。而在编译的过程中,经常需要告诉编译......
  • w3c xml 操作类
    以下从网上找的,自己最近在一个小功能上需要应用记录下来。packagerochoc.xml.oper;importjava.io.File;importjava.io.IOException;importja......
  • java poi 读取.doc审阅 修订 最终状态 问题
    一、前景    在使用javapoi读取.doc文件,遇到审阅修订功能时,poi不能读取修定状态为“最终状态”的数据,而是读取了所有修定内容,如下图所示:文本读取内容:正确内......
  • Java使用SAX解析xml文档
    步骤1.创建解析工厂2.从工厂中获取解析器3.自行编写处理器:继承DefaultHandler,重写相关方法。4.加载自己的处理器5.开始解析6.读取数据例子读取此xml文件内容。创......
  • C#中XmlTextWriter读写xml文件详细介绍
    XmlTextWriter类允许你将XML写到一个文件中去。这个类包含了很多方法和属性,使用这些属性和方法可以使你更容易地处理XML。为了使用这个类,你必须首先创建一个新的XmlTextWri......
  • 使用xlxs.js读取上传xlsx文件
    xlsx的github地址:https://github.com/SheetJS/sheetjs<!DOCTYPEhtml><html><head><metacharset="utf-8"/><scriptsrc="jquery/jquery-1.9.1.min.js"><......
  • js使用FileReader读取上传csv文件
    <script>functionreadCsv(){constfile=$("#uploadFile")[0].files[0];if(file.type!="text/csv"){alert("文件类型错误");return;......