什么是XML语言?

  • xml是一种可扩展标记语言,html是超文本标记语言
  • xml的所有标签和属性都是自定义的,都由编写者决定
  • 文件的信息一定要写在第一行,比如版本信息,编码信息
  • 一个xml文件,只能存在一个根标签
  • 有内容的标签必须有开始标签和结束标签,没有内容的标签可以使用一个表示
<?xml version="1.0" encoding="UTF-8" ?>
<!--
1.xml表示文件格式是xml
2.version表示格式的版本是1.0
3.encoding表示文件编码格式是utf-8
4.<students>是根标签,一个xml文件只能有一个根标签
5.<student>是当前xml文件的第一个元素
6.id是自定义的student标签的属性
7.<name>是<student>的子标签
-->
<students>
    <student id="01">
        <name>杨逸</name>
        <age>11</age>
    </student>
    <student id="02">
        <!--这里的name标签就是有内容标签,不可省略结束结束标签,一定要有两个标签-->
        <name>kk</name>
        <!--这里的age标签就是没内容的标签,可以省略结束标签,用一个<age/>表示-->
        <age/>
    </student>
</students>
  • 特殊的CDATA标签

    • 它用于标记,不希望被解析的内容,例如代码
    <?xml version="1.0" encoding="UTF-8" ?>
    <codes>
    <!--    在CDATA标签放不希望被解析的内容,比如代码-->
        <![CDATA[
     <script>
        function hi(){
          console.log("杨逸,你好");
          alert("hi()函数被调用");
        }
      </script>
        ]]]>
    </codes>
    
  • 特殊的转义字符

  • 表示小于号(<)的:&lt;

  • 表示大于号(>)的:&gt;

  • 表示&符号的:&amp;

  • 表示英文双引号的:&quot;

  • 表示英文单引号的:&apos;

java解析XML文件

  1. dom解析技术是W3C组织制定的,而所有的编程语言都对这个解析技术使用了自己语言的特点进行实现。Java对dom技术解析也做了实现
  2. sun公司在JDK5版本对dom解析技术进行升级:SAX(Simple API for XML)解析,它是以类似事件机制通过回调告诉用户当前正在解析的内容。是一行一行的读取xl文件进行解析的。不会创建大量的dom对象。所以它在解析xml的时候,在性能上优于Dom解析
  3. 这两种技术已经过时,知道有这两种技术即可
  4. 第三方的XML解析技术
    1. jdom在dom基础上进行了封装
    2. dom4j又对jdom进行了封装。
    3. pull主要用在Android手机开发,是在跟sax非常类似都是事件机制解析xml文件
  • 现在基本使用dom4j技术对XML文件进行解析

XMl文件的读取

  • 首先通过SAXReader得到XML的解析器
  • 然后使用XML解析器读取XML文件
  • 再通过读取到XML文件对象,对XMl文件进行操作
  • 如果修改XML文件,则需要重新将XMl对象写出到对应的文件
dom4j的综合案例
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;

public class homework1 {
  public static void main(String[] args) throws DocumentException {
    //获得xml的解析器
    SAXReader saxReader = new SAXReader();
    //读取xml文档,获得xml对象
    Document xml = saxReader.read("src/homework1.xml");
    //获得根节点
    Element rootElement = xml.getRootElement();
    //通过elements获得所有book元素
    List<Element> books = rootElement.elements("book");
    //遍历读取信息
    for (Element book :books) {
      String name = book.element("name").getText();
      String author = book.element("author").getText();
      double price = Double.parseDouble(book.element("price").getText());
      //创建book对象
      book book1 = new book(name, author, price);
      System.out.println("book对象的信息"+book1);
    }
  }
}

XML文件标签的添加和修改(通过程序修改)

  • 添加标签
    1. 先使用DocumentHelper创建标签节点
    2. 然后设置内容,挂在相应的父标签上
    3. 最后重新输出
  • 删除标签
    1. 先的到要删除标签的父标签
    2. 然后通过父标签的remove方法删除
    3. 最后重新输出
  • 修改标签
    1. 先得到要修改的标签
    2. 然后通过setText方法修改内容
    3. 最后重新输出
  • XMl的输出
    1. 直接输出是会乱码的,要先设置编码格式
    2. 然后设置输出的方式(创建相应的流),默认是输出的控制台
    3. 最后关闭流
{
    public static void main(String[] args) throws DocumentException, IOException {
        alter();
    }
    //添加
    static void add() throws IOException, DocumentException {
        //得到解析器
        SAXReader saxReader = new SAXReader();
        //读取XML文件
        Document xml = saxReader.read("src/students.xml");
        //使用DocumentHelper.createElement创建标签节点
        Element newstudent = DocumentHelper.createElement("student");
        Element newname = DocumentHelper.createElement("name");
        Element newage = DocumentHelper.createElement("age");

        //添加属性
        Element id = newstudent.addAttribute("id", "02");
        //给标签设置内容
        newname.setText("安妮");
        newage.setText("88");
        //将子标签挂到父标签下
        newstudent.add(newname);
        newstudent.add(newage);
        //将student挂到根标签下
        xml.getRootElement().add(newstudent);
        //将xml对象重新输出到XML文件
        //不能直接输出,会有乱码
        //创建一个输出格式对象,将输出编码设置为utf-8
        OutputFormat prettyPrint = OutputFormat.createPrettyPrint();
        prettyPrint.setEncoding("utf-8");

        //创建一个字节输出流,输出xml对象修改的内容
//        XMLWriter xmlWriter = new XMLWriter(new FileOutputStream("src/students.xml"),prettyPrint);
        XMLWriter xmlWriter = new XMLWriter();
        //设置输出流
        xmlWriter.setOutputStream(new FileOutputStream("src/students.xml"));
        xmlWriter.write(xml);
        xmlWriter.close();
    }
    //删除
    static  void del() throws DocumentException, IOException {
        //得到解析器
        SAXReader saxReader = new SAXReader();
        //读取XML文件
        Document xml = saxReader.read("src/students.xml");
        Element rootElement = xml.getRootElement();
        //得到要删除标签的父标签
        Element student = rootElement.element("student");
        //通过父标签删除id为02的标签,也删除属性,一样也适用remove方法
        student.getParent().remove(student);
        //设置输出编码
        OutputFormat outputFormat = new OutputFormat();
        outputFormat.setEncoding("utf-8");
        //重新输出
        XMLWriter xmlWriter = new XMLWriter();
        xmlWriter.setOutputStream(new FileOutputStream("src/students.xml"));
        xmlWriter.write(xml);
        xmlWriter.close();
    }
    //修改
    static void alter() throws DocumentException, IOException {
        //得到解析器
        SAXReader saxReader = new SAXReader();
        //读取XML文件
        Document xml = saxReader.read("src/students.xml");
        //得到根标签
        Element rootElement = xml.getRootElement();
        //得到要修改的标签
        Element student = rootElement.element("student");
        Element name = student.element("name");
        name.setText("yangyi");

        OutputFormat outputFormat = new OutputFormat();
        outputFormat.setEncoding("utf-8");

        XMLWriter xmlWriter = new XMLWriter();
        xmlWriter.setOutputStream(new FileOutputStream("src./students.xml"));
        xmlWriter.write(xml);
        xmlWriter.close();
    }
}