详解xml-java语言

本文介绍了XML的基本概念、书写格式,以及DOM4j在处理XML文档中的应用,包括读取文件、解析文本、创建和修改XML元素,以及DOM4j的使用方法和示例代码。
摘要由CSDN通过智能技术生成

1.XML在线学习手册

XML 教程

2.XML可以做什么

  • 1.给两个程序之间进行数据通信。现在用的最多的是JSON。

  • 2.给服务器做配置文件

  • 3.存储复杂的数据关系。

  • 4.还可以充当小型的数据库。

3.书写格式

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="10021">
        <name>张三</name>
        <age>22</age>
        <gender>男</gender>
        <className>软工一班</className>
    </student>
</students>

解释以上xml的格式

1.xml:表示该文件的类型 xml,放在第一行

2.version=“1.0” 表示版本

3.encoding="UTF-8"文件编码

4.students:它表示的是root元素/根元素,是由程序员自己来写的

5.student:表示students的一个子元素,可以有很多个。

6.id就是属性 name age gender className 是students元素的子元素。

7.在xml中也可以有注释<!---->

4.xml语法格式

1.每个xml文档必须有且只有一个根元素

2.根元素是一个完全包括文档中其他所有元素的元素。

3.根元素的起始标记要放在所有其他元素的起始标记之前。

4.根元素的结束标记要放在所有其他元素的结束标记之后。

5.如果标签内没有内容,可以简写 <b></b> 可以简写为</b>

6.标签不允许交叉嵌套 <name>张三</name>,像这样就是不允许的。

7.区分大小写:比如:<email></email>和<Email></Email>这两个是不同的标签。

8.不能以数字开头,这个好理解,就不做解释了。

9.名称之间不能使用冒号":".

10.如果标签单词需要间隔,建议使用下划线,比如<book_name></book_name>

11.属性值 使用双引号(“”)或者是单引号('')分隔(如果属性值中有单引号(‘’),则用双引号("")分隔,有双引号(''),则用单引号分隔(‘’))

12.一个元素可以有多个属性,它的基本格式为:<元素名 属性名 = ""属性值">

13.特定的属性名称在同一个元素标记中只能出现一次。

14.属性值不能包括&字符。

5.什么是CDATA节

有些内容不想让解析引擎执行,而是当做原始内容,可以使用CDATA包括起来,CDATA节中的所有字符都会被当做简单文本,而不是XML标记。

语法:

<!CDATA[
这里就是可以把你输入的字符原样显示,不会解析xml
]]>

可以把你输入的字符原样输出,除了]]>。

也是不能嵌套的。

简单点来说:如果你希望吧某些字符串,当做普通文本,使用CDATA包括。

6.转义字符

表示一些特殊的字符。

转义符符号
$lt;<
$gt;>
$amp;&
$quot;""
$apos;''

7.DOM4j

不管是HTML文件还是xml文件,他们都是标记型文档,都可以使用w3c组织制定的dom技术来解析。

document对象表示的是整个文档。

第三方 XML解析技术

1.jdom在dom基础上进行了封装。

2.dom4j又对jdom进行了封装。

什么是DOM4j?

Dom4j是一个简单的灵活的开放源代码的库(主要是用于解析/处理XML文件)。Dom4j是由早期开发JDOM的人分离开发出来的。

与JDOM不同的是,dom4j使用接口和抽象基类,虽然Dom4j的API相对要复杂一些,但是它提供了比JDOM更好的灵活性。

Dom4j是一个优秀的Java XML API , 具有性能优异、功能强大和容易使用的特点。

使用Dom4j需要下载Dom4j相应的jar包。dom4j

获取Document对象的方式有三种

1.读取XML文件,获取document对象。

 SAXReader reader = new SAXReader();//创建一个解析器
Document document = reader.read(new File("src/...xml"));//XML Document
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.io.SAXReader;

import java.io.File;

public class Dom4j_test {
    public static void main(String[] args) throws DocumentException {
        //加载XML文件
        //得到一个解析器
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/students.xml"));
        System.out.println(document);//org.dom4j.tree.DefaultDocument@2a0b20 [Document: name file:///C:/study/java/study_code/xml/src/students.xml]
    }
}

2.解析XML形式的文本,得到Document对象。

String text = "<members></members>";
Document documnet = DocumentHelper.parseText(text);

3.主动创建Document对象。

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

遍历xml中的元素

<?xml version="1.0" encoding="UTF-8" ?>
<students>
    <student id="10021">
        <name>张三</name>
        <age>22</age>
        <gender>男</gender>
        <className>软工一班</className>
    </student>
    <student id="10022">
        <name>李四</name>
        <age>21</age>
        <gender>女</gender>
        <className>软工二班</className>
    </student>
</students>
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;

public class Dom4j_test {
    public static void main(String[] args) throws DocumentException {
        //加载XML文件
        //得到一个解析器
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/students.xml"));

        //遍历xml
        //1.得到rootElement
        Element rootElement = document.getRootElement();
        List<Element> students = rootElement.elements();
        for (Element student : students) {
            //student元素的name ...
            Element name = student.element("name");
            Element age = student.element("age");
            Element gender = student.element("gender");
            Element className = student.element("className");
            System.out.println("学生信息:" + name.getText() + ",年龄:" + age.getText() +
                    ",性别:" + gender.getText() + ",班级:" + className.getText());
        }
    }
}
//学生信息:张三,年龄:22,性别:男,班级:软工一班
//学生信息:李四,年龄:21,性别:女,班级:软工二班

指定得到某一个学生

//获取第一个学生
Element student = (Element) rootElement.elements("student").get(0);
System.out.println("该学生的信息:"+student.element("name").getText()+student.element("age").getText()+"性别:" + student.element("gender").getText() + ",班级:" + student.element("className").getText());

获取元素的属性

//获取student的属性
System.out.println("id=" + student.attributeValue("id"));

完整代码:

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.io.File;
import java.util.List;

public class Dom4j_test {
    public static void main(String[] args) throws DocumentException {
        //加载XML文件
        //得到一个解析器
        SAXReader reader = new SAXReader();
        Document document = reader.read(new File("src/students.xml"));

        //遍历xml
        //1.得到rootElement
        Element rootElement = document.getRootElement();
        List<Element> students = rootElement.elements();
        for (Element student : students) {
            //student元素的name ...
            Element name = student.element("name");
            Element age = student.element("age");
            Element gender = student.element("gender");
            Element className = student.element("className");
            System.out.println("学生信息:" + name.getText() + ",年龄:" + age.getText() +
                    ",性别:" + gender.getText() + ",班级:" + className.getText());
        }

        //获取第一个学生
        Element student = (Element) rootElement.elements("student").get(0);
        System.out.println("该学生的信息:" + student.element("name").getText() + student.element("age").getText() + "性别:" + student.element("gender").getText() + ",班级:" + student.element("className").getText());

        //获取student的属性
        System.out.println("id=" + student.attributeValue("id"));
    }
}

增加,删除,修改

添加一个学生:

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;

import java.io.*;

public class Dom4j_demo {
    public static void main(String[] args) throws DocumentException, IOException {
        //1.得到解析器
        SAXReader reader = new SAXReader();
        //2.指定解析哪个xml文件
        Document document = reader.read("src/students.xml");

        //首先先要创建一个学生节点对象
        Element student = DocumentHelper.createElement("student");
        //给元素添加属性
        student.addAttribute("id", "10023");

        Element student_name = DocumentHelper.createElement("name");
        student_name.setText("王五");
        Element student_age = DocumentHelper.createElement("age");
        student_age.setText("23");
        Element student_gender = DocumentHelper.createElement("gender");
        student_gender.setText("男");
        Element student_className = DocumentHelper.createElement("className");
        student_className.setText("软工三班");

        //把子元素添加到student下
        student.add(student_name);
        student.add(student_age);
        student.add(student_gender);
        student.add(student_className);

        //在把student节点添加到根元素
        document.getRootElement().add(student);
        //直接输出会出现中文乱码
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        outputFormat.setEncoding("utf-8");//输出的编码为utf-8

        //把xml进行更新
        XMLWriter writer = new XMLWriter(
                new FileOutputStream(new File("src/students.xml")), outputFormat
        );

        writer.write(document);
        System.out.println("添加成功!!!!");
        writer.close();
    }
}

删除一个子节点(学生)

 

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileOutputStream;


public class Dom4j_demo2 {
    public static void main(String[] args) throws Exception {
        //1.得到解析器
        SAXReader reader = new SAXReader();
        //2.指定解析的xml文件
        Document document = reader.read(new File("src/students.xml"));
        //3.找到该元素的第一个学生
        Element student = (Element) document.getRootElement().elements("student").get(0);
        //删除元素
        student.getParent().remove(student);
        //直接输出会出现中文乱码
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        outputFormat.setEncoding("utf-8");//输出的编码为utf-8
        //把xml进行更新
        XMLWriter writer = new XMLWriter(
                new FileOutputStream(new File("src/students.xml")), outputFormat
        );
        writer.write(document);
        System.out.println("删除成功!!!!");
        writer.close();
    }
}

 

修改一个子节点(学生)

把所有的学生加一


import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
public class Dom4j_demo3 {
    public static void main(String[] args) throws Exception {
        //1.得到解析器
        SAXReader reader = new SAXReader();
        //2.指定解析的xml文件
        Document document = reader.read(new File("src/students.xml"));
        //得到所有学生的年龄
        List<Element> students = document.getRootElement().elements("student");
        for (Element student : students) {
            Element age = student.element("age");
            age.setText((Integer.parseInt(age.getText()) + 1) + "");
        }
        //直接输出会出现中文乱码
        OutputFormat outputFormat = OutputFormat.createPrettyPrint();
        outputFormat.setEncoding("utf-8");//输出的编码为utf-8
        //把xml进行更新
        XMLWriter writer = new XMLWriter(
                new FileOutputStream(new File("src/students.xml")), outputFormat
        );
        writer.write(document);
        System.out.println("更新成功!!!!");
        writer.close();
    }
}

 8.小结

感谢您花时间浏览本篇文章,本文章是笔者的学习笔记,如果您在学习当中发现了问题,还请您在评论区留言,笔者看到后会在第一时间处理,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

与风过山岗

您的鼓励是我莫大的荣幸

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值