Java SE XML

Java SE XML

1、XML

  1.xml语言是一门标记语言

  2.html语法规则非常松散,xml语法规则非常严格

  3.html中的标签固定的,xml语言中的标签是自定义的,根据需求定义

  4.作用: 存储数据,解析数据,传递数据,配置信息…

  5.学习目标: 看得懂,会填写,会编写

  6.标签:
    双标签 : 又开始有结束,成对出现
    单标签 : 开始标签上就闭合

  7.< ?xml version=“1.0” encoding=“utf-8”? > 版本控制声明,必须存在xml文件的首行存在

  8.有且仅有一个根元素,跟标签

  9.标签可以添加属性和子标签
    属性的作用: 帮助标签展示作用功能

<!--标签及内容可以对应java中的对象信息-->
<person>
    <!--商品-->
    <ps id="11">
        <no>102</no>
        <name>苹果</name>
    </ps>
    <ps id="12">
        <no>103</no>
        <name>丝瓜</name>
    </ps>
    <ps id="13">
        <no>104</no>
        <name>西瓜</name>
    </ps>
    <ha>
        <no>105</no>
        <name>&lt;思思&gt;</name>
    </ha>
</person>

1.2 基础语法

结构XML 文档形成了一种树结构,它从根部开始,然后扩展到枝叶。

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

  • 必须有XML声明语句 (第一行)
  • 必须有且仅有一个根元素
  • 标签成对
  • 元素正确嵌套
  • 拥有正确语法的 XML 被称为“形式良好”的 XML。
  • 通过某个 DTD 进行了验证的 XML 是“合法”的 XML。
1.2.2 、标签、元素、属性

  在 xml 中通过一对 <> 引起来的内容称为 标签 ,标签有开始有结束(也可以有自闭合标签),需正确配对,开始标签和结束标签之间只差一个 / 。标签区分大小写。

标签中还可以存在属性(一般在开始标签中),属性为标签添加了一些额外信息,属性的形式为 属性名=“属性 值” ,一个标签中可以存在多个属性。

  从开始标签到结束标签作为一个整体,称为 元素。xml文件就是由一个一个的元素组成的。

2、解析XML

DOM4J 解析xml

  1. 获取流 SAXReader reader = new SAXReader();
  2. 指定文件,加载文件,把xml文件加载到内存 Document
  3. 操作标签内容
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import java.util.List;

/*
    DOM4J 解析xml
        1. 获取流  SAXReader reader = new SAXReader();
        2.指定文件,加载文件,把xml文件加载到内存 Document
        3.操作标签内容
 */
public class XmlDemo02 {
    public static void main(String[] args) throws DocumentException {
        //1.获取流
        SAXReader sr=new SAXReader();
        //2.加载xml文件
        Document dmt = sr.read("src\\week04/day05/xml/person.xml");

        //3.解析数据
        //跟标签
        Element emt= dmt.getRootElement();
        System.out.println("根节点"+emt.getName());

        //子标签
        List<Element> list = emt.elements();
        for(Element ele:list){
            System.out.println(ele.getName());
            System.out.println(ele.attributeValue("id"));

            List<Element> ls = ele.elements();
            for(Element e:ls){
                System.out.println(e.getName()+"--->"+e.getData());
            }
        }

    }
}

2.1、获取xml文件中的内容

public static void main(String[] args) throws DocumentException, IOException {
    //1获取document
    Document dt=getDocument("src\\week04/day05/xml/person.xml");
}
//获取Document对象
    public static Document getDocument(String path) throws DocumentException {
        //1\创建一个SaxReader
        SAXReader srr=new SAXReader();
        //2\加载XML文件
        Document doc= srr.read(path);
        return doc;
    }

2.2、遍历内容

public static void main(String[] args) throws DocumentException, IOException {
        //1获取document
        Document dt=getDocument("src\\week04/day05/xml/person.xml");
        //2\遍历
        print(dt);
//获取Document对象
    public static Document getDocument(String path) throws DocumentException {
        //1\创建一个SaxReader
        SAXReader srr=new SAXReader();
        //2\加载XML文件
        Document doc= srr.read(path);
        return doc;
    }
//封装遍历方法
    public static void print(Document dmt){
        //1\获取归根节点
        Element root=dmt.getRootElement();
        System.out.println("根节点:"+root.getName());
        //2、获取子节点
        //List<Element> list=root.elements("good");
        List<Element> list=root.elements();
        for (Element emt: list) {
            System.out.println("子标签:"+emt.getName());
            //获取遍历子元素迭代器
            Iterator<Element> ig=emt.elementIterator();
            while(ig.hasNext()){
                Element e= ig.next();
                System.out.println("孙子标签:"+e.getName()+"-->"+e.getData());

            }
        }
    }

2.3、写出到xml文件

 public static void main(String[] args) throws DocumentException, IOException {
        //3\写出
        writeToXml(create());

        print(getDocument("src\\week04/day05/xml/Student.xml"));
    }
//创建Document
    public static Document create(){
        //1.创建一个Document对象
        Document dmt= DocumentHelper.createDocument();
        //2添加根节点
        Element root= dmt.addElement("Student");
        //3添加子标签
        Element  ele=root.addElement("student");
        ele.addElement("name").addText("张三");
        ele.addElement("age").addText("18");
        ele.addAttribute("id","1002");

        Element ele2=root.addElement("student");
        ele.addElement("name").addText("李四");
        ele.addElement("age").addText("20");
        ele.addAttribute("id","1004");

        return dmt;
    }

//写出到xml文件
    public static void writeToXml(Document dmt) throws IOException {
        //2指定输出格式的标签格式
        //OutputFormat fmt=OutputFormat.createCompactFormat();//不换行文本
        OutputFormat fmt=OutputFormat.createPrettyPrint();

        //构建输出流:XMLWriter
        XMLWriter xw=new XMLWriter(new FileWriter("src\\week04/day05/xml/Student.xml"),fmt);

        //3写出
        xw.write(dmt);
        //4刷出
        xw.flush();
        //5关闭
        xw.close();
    }

2.4、删除与修改 remove()

父节点.remove(子节点)

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

import java.io.FileWriter;
import java.io.IOException;
import java.util.List;

/*
    删除与修改
        父节点.remove(子节点)
 */
public class XMLDemo01 {
    public static void main(String[] args) throws DocumentException, IOException {
        //1.流
        SAXReader reader = new SAXReader();
        //2.加载xml
        Document document = reader.read("src/user.xml");
        //3.遍历
        Element root = document.getRootElement();

        List<Element> list = root.elements();

        list.forEach(e->{
            //如果是no为102的用户,性别修改为男
            if(e.attributeValue("no").equals("102")){
                e.attribute("sex").setValue("男");
            }

            List<Attribute> ats = e.attributes();
            ats.forEach(attribute -> {
                System.out.println(attribute.getName()+"--->"+attribute.getValue());
            });


            List<Element> list2 = e.elements();
            list2.forEach(element -> {
                System.out.println(element.getName()+"====>"+ element.getData());
                //如果name为张三.同时子标签名为haha,就删除haha这个标签
                if(e.element("name").getText().equals("张三") &&  element.getName().equals("haha")){
                    e.remove(element);
                }
            });

        });

        //写出
        //1.输出格式
        OutputFormat format = OutputFormat.createPrettyPrint();
        //2.XMLWriter输出流
        XMLWriter writer = new XMLWriter(new FileWriter("src/user.xml"),format);
        //3.写出
        writer.write(document);
        //4.刷出
        writer.flush();
        //5.关闭
        writer.close();
    }
}

3、XML文档约束

    在XML技术里,可以编写一个文档来约束一个XML文档的书写规范(与xml语法无关),这称之为XML约束。此举主要是为了保证数据的规范性和安全性

  • DTD约束:语法简洁,功能比较单一。
  • Schema约束:语法复杂,功能比较强大。

3.1、 DTD约束

DTD即文档类型定义-- Document Type Definition

一个DTD文档可能包含如下内容

  • \1.元素的定义规则
  • \2. 元素之间的关系规则
  • \3. 属性的定义规则

DTD约束和xml写在一个文件中。

语法:

​ < !DOCTYPE 根元素 [元素声明] >

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE Student [
        <!ELEMENT Student (student) >
        <!ELEMENT student (name,age)>
        <!ELEMENT name (#PCDATA)>
        <!ELEMENT age (#PCDATA)>
        ]>
<Student>
  <student >
    <name>张三</name>
    <age>18</age>

  </student>
  <student >
    <name>李四</name>
    <age>20</age>
  </student>

</Student>

3.2、DTD 外部导入

    当验证的XML文件较多时,使用内部DTD可能出现冗余,此时可以通过引入dtd 文件进行xml 约束。

<!DOCTYPE 根元素 SYSTEM "文件名">

SYSTEM 本地文件系统

PUBLIC DTD文件为网络文件,url

<!DOCTYPE mapper 
		PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
		"http://mybatis.org/dtd/mybatis-3- mapper.dtd">
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值