1.XML文档语法

1. 版本控制 必须存在,并且必须存在于首行
2.标记语言是<>定义
3.在xml文件中可以自定义标签,在html中使用的是html提供的标记
4.在xml文件中有且仅有一个跟标签|根元素
5.标签分为: 双标签(闭合标签) | 单标签(自闭和标签)
6.xml是一个语言严格的标记语言
7.作用: 做数据的存储,传输,解析...
8.属性: 帮助更完整|全面的展示标签的作用 属性名="属性值"

<?version=1.0 encoding="UTF-8"?>
<!--人员列表-->  --->注释
<persons> ---> 根标记
    <person id="01"> 
        <name>邹辉</name>
        <age>18</age>
        <gender>男</gender>
    </person>
    <person id="02">
        <name>胜辉</name>
        <age>19</age>
        <gender>女</gender>
    </person>
</persons>

格式良好的 XML 文档需满足以下条件

  • 必须有XML声明语句 (第一行)
  • 必须有且仅有一个根元素
  • 标签成对
  • 元素正确嵌套

XML里的预加载实体

xml中,一些字符拥有特殊的意义。如果把字符 < 放在xml元素中,会发生错误,这是因为解析器会把它当作新元素的开始,这样会产生xml错误。

2.XML解析

推荐使用Dom4J解析Xml

persons.xml

<?xml version="1.0" encoding="UTF-8"?>
<!--相当于一个 list,存储包含多个Person信息 -->
<Persons>
  <Person id="01">
    <name>迪丽热巴</name>
    <age>27</age>
    <gender>女</gender>
  </Person>
  <Person id="02">
    <name>范冰冰</name>
    <age>35</age>
    <gender>女</gender>
  </Person>
  <Teacher id="03">
    <name>马云</name>
    <age>50</age>
    <gender>男</gender>
    <subject>英语</subject>
  </Teacher>
</Persons>

2.1查询节点

getRootElement 获取xml文件的根节点

getName 获取节点的名字

getText 获取节点的文本

root.elements()-->获得根节点下的子节点

root.element()-->获得具体某个节点

attribute代表节点里面的属性 -->

attributeValue代表获得节点里面的具体属性

public static void main(String[] args) throws Exception {
    //1.创建SAXReader对象
    SAXReader reader = new SAXReader();
    //2.加载某个xml文件
    Document document = reader.read(new File("src/persons.xml"));
    //3.获取根元素
    Element root = document.getRootElement();
    System.out.println("根节点: "+root.getName());
    //遍历|获取子节点
    List<Element> list = root.elements();
    //遍历根元素的第一层子节点
    list.forEach((e)->{
        System.out.println("标签 名称: "+e.getName());
        System.out.println("id属性值: "+e.attributeValue("id"));  //根据属性名字获取属性值
        //获取第二层子节点
        List<Element> list2 = e.elements();
        //遍历 拿到每一个姓名,年龄,性别
        for(Element ele:list2){
            System.out.println(ele.getName()+"----->"+ele.getText());
        }
    });
}

2.2添加节点

SAXReader reader=new SAXReader();
//获取person文档
Document document=reader.read(new File("src/person.xml"));
//获取根节点
Element rootElement = document.getRootElement();
//添加"teacher"节点
Element element = rootElement.addElement("teacher");
//teacher节点再添加子节点salary并将salary标签里的文本设置为4000
element.addElement("salary").addText("4000");
//设置写出的格式 
//PrettyPrint是稍微整洁点的格式
//CompatPrint是一行输出
OutputFormat prettyPrint = OutputFormat.createPrettyPrint();
//加载xml输出器
XMLWriter writer=new XMLWriter(new FileWriter("src/person.xml"),prettyPrint);
//将xml文件写出
writer.write(document);

writer.flush();

writer.close();

2.3通过代码写xml文件

Document document = DocumentHelper.createDocument();
Element element=document.addElement("zh");
Element first=element.addElement("aaa");
first.addAttribute("你好","哈哈哈");
Element element1 = first.addElement("bbb");
element1.addText("aaa");
OutputFormat format=OutputFormat.createPrettyPrint();
format.setEncoding("UTF-8");
FileOutputStream fileOutputStream=new FileOutputStream(new File("src/aaa.xml"));
XMLWriter writer=new XMLWriter(fileOutputStream,format);
writer.write(document);
writer.flush();
writer.close();

2.4删除节点

使用remove函数删除

SAXReader reader=new SAXReader();

Document read = reader.read(new File("src/person.xml"));

Element rootElement = read.getRootElement();

List<Element> elements = rootElement.elements();

elements.forEach((element -> {
    //获取id属性
    Attribute attribute = element.attribute("id");
    //获取属性的值
    String value = attribute.getValue();
    System.out.println(element.getName());
    //如果属性值等于"1" 则删除
    if("1".equals(value)){
        rootElement.remove(element);
    }
}));
//写出xml文件
OutputFormat outputFormat=OutputFormat.createPrettyPrint();
XMLWriter writer=new XMLWriter(new FileWriter("src/person.xml"),outputFormat);
writer.write(read);
writer.flush();
writer.close();