XML简介 (EXtensible Markup Language)

发布时间:2023年12月23日

XML简介 (EXtensible Markup Language)

可扩展标记语言

  • 特点
    • XML与操作系统、编程语言的开发平台无关
    • 实现不同系统之间的数据交换
  • 作用
    • 数据交互
    • 配置应用程序和网站
    • Ajax基石

XML标签

  • XML文档内容由一系列标签元素组成
<元素名 属性名="属性值">元素内容</元素名>
  • 属性值用双引号包裹
  • 一个元素可以有多个属性
  • 属性值中不能直接包含 < " &
  • 不建议使用的字符 ` >

XML编写注意事项

  • 注意事项
    • 所有XML元素都必须有结束标签
    • XML标签对大小写敏感
    • XML必须正确的嵌套
    • 同级标签以缩进对齐
    • 元素名称可以包含字母、数字或其他的字符
    • 元素名称不能以数字或者标点符号开始
    • 元素名称中不能包含空格
XML解析器
  • 解析器类型
    • 非验证解析器
      • 检查文档格式是否良好
    • 验证解析器
      • 使用DTD检查文档的有效性
XML命名空间
  • XML命名空间的作用
    • 解决在复杂 大型XML文件中 出现名称相同 但是含义不同的元素
<?xml version="1.0" encoding="UTF-8"?>
<cameras xmlns:canon="http://www.canon"
xmlns:nikon="http://www.nikon.com">
<canon:camera prodID="P663" name="Camera傻瓜相机"/>
<nikon:camera proID="K29B3" name="Camera超级35毫米相机"/>
</cameras>
解析XML技术
  • DOM
    • 基于XML文档树结构的解析
    • 适用于多次访问的XML文档
    • 特点:比较消耗资源
  • SAX
    • 基于事件的解析
    • 适用于大数据量的XML文档
    • 特点:占用资源少,内存消耗小
  • DOM4J
    • 非常优秀的Java XML API
    • 性能优异、功能强大
    • 开放源代码
DOM解析XML
  • DOM介绍
    • 文档对象模型(Document Object Model)
    • DOM把XML文档映射成一个倒挂的树
      在这里插入图片描述
常用接口介绍
  • DOM解析包:org.w3c.dom
常用接口常用方法说明
Document:表示整个XML文档NodeList getElementsByTagName(String Tag)按文档顺序返回文档中指定标记名称的所有元素集合
Element createElement(String tagName)创建指定标记名称的元素
Node:该文档树中的单个节点NodeList getChildNodes()获取该元素的所有子节点,返回节点集合
Element:XML文档中的一个元素String getTagName()获取元素名称

示例

<?xml version="1.0" encoding="UTF-8" ?>
<!--根标签只能有一对儿-->
<books>
    <!--在标签内可以写属性-->
    <!--转义符  > &gt;  < &lt; -->
    <!--1.属性值必须要用引号包裹
        2.一个元素可以有多条属性
        3.尽量不要使用 < > -->
    <book id="1" bookname="三体" price="12"/>

    <book>
        <id>1</id>
        <bookname>三体</bookname>
        <price>12</price>
    </book>
    <!--1. 所有的标签必须闭合-->
    <!--2. xml的标签对大小写敏感-->
    <!--3. 所有的xml标签 必须正确嵌套-->
    <!--4. 同级标签需要对齐缩进-->
    <!--5. 标签名称不能以数字或标点符号开始-->


</books>

练习

<?xml version="1.0" encoding="UTF-8" ?>
<clothes>
    <cloth range="height&lt;165">S</cloth>
    <cloth range="165&gt;height&lt;170">M</cloth>
    <cloth range="170&gt;height&lt;175">L</cloth>
    <cloth range="175&gt;height&lt;180">XL</cloth>
    <cloth range="180&gt;height">XXL</cloth>
</clothes>

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

public class Test01 {
    public static void main(String[] args) {
        //通过解析器解析XML文件
        SAXReader saxReader=new SAXReader();
        try {
            saxReader.read("D:\\ideaworkspace\\J3071javaoop\\J3071JavaAdvanced\\src\\Learn\\Day\\Day230914\\XMLdemo\\clothes.xml");
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}

增删改查

查询

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

import java.util.Iterator;

public class Test01 {
    public static void main(String[] args) {
        //通过解析器解析XML文件
        SAXReader saxReader=new SAXReader();
        try {
            //通过解析器获取文件对象  Document 文件文档
            Document document = saxReader.read("D:\\ideaworkspace\\J3071javaoop\\J3071JavaAdvanced\\src\\Learn\\Day\\Day230914\\XMLdemo\\clothes.xml");
            //获取根节点
            Element root = document.getRootElement();
            //获取根节点的迭代器
            Iterator iterator = root.elementIterator();
            while (iterator.hasNext()){
                //获取子节点元素 获取到的是cloth标签
                Element element=(Element) iterator.next();
                //获取子元素节点的属性
                System.out.println(element.attributeValue("range"));
                //获取子元素节点的文本内容
                System.out.println(element.getText());
                
            }
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }
}


public class Test03 {
    public static void main(String[] args) {
        Test02 test02=new Test02();
        //test02.add();//增加
        //test02.delete();//删除
        test02.update();//修改
    }
}

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.Iterator;

public class Test02 {
    //对xml文件进行增删改查
    private  Document document;

    /**
     * 初始化
     */
    public  void init(){
        SAXReader saxReader=new SAXReader();
        try {
            document= saxReader.read("D:\\ideaworkspace\\J3071javaoop\\J3071JavaAdvanced\\src\\Learn\\Day\\Day230914\\XMLdemo\\clothes.xml");
        } catch (DocumentException e) {
            e.printStackTrace();
        }
    }

    /**
     * 给xml文件内添加节点
     */
    public  void add(){
        init();
        //获取文档节点
        Element root=document.getRootElement();
        //在根节点下添加一个cloth节点
        Element cloth = root.addElement("cloth");
        cloth.addAttribute("id","123");
        cloth.addText("今天中午吃什么");
        save();
        System.out.println("添加成功!!");
    }
    /**
     * 保存文件
     */
    public  void save(){
        //创建输出格式并设置输出编码
        OutputFormat format=OutputFormat.createCompactFormat();
        format.setEncoding("utf-8");
        try {
            XMLWriter xmlwriter=new XMLWriter(new FileWriter("D:\\ideaworkspace\\J3071javaoop\\J3071JavaAdvanced\\src\\Learn\\Day\\Day230914\\XMLdemo\\clothes.xml"));
            xmlwriter.write(document);
            xmlwriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 删除节点
     */
    public void delete(){
        init();
        //获取根节点
        Element root=document.getRootElement();
        //获取根节点迭代器
        Iterator iterator=root.elementIterator();
        //遍历子节点
        while (iterator.hasNext()){
            //获取子节点对象
            Element e=(Element) iterator.next();
            if (e.getText().equals("今天中午吃什么")){
                //从父节点中删除本节点
                e.getParent().remove(e);
                System.out.println("删除成功!!!");
            }
        }

        save();

    }

    /**
     * 修改
     */
    public void update(){
        init();
        Element root=document.getRootElement();
        Iterator iterator=root.elementIterator();
        while (iterator.hasNext()){
            Element e=(Element) iterator.next();
            // attributeValue 属性值
            if (e.attributeValue("id")!=null&&e.attributeValue("id").equals("123")){
                e.addAttribute("price","999");//给指定节点添加属性
                System.out.println("修改成功");
                break;
            }
        }
        save();

    }

}

JOSN简介

  • JSON(JavaScript Object Notation)
    • 轻量级的文本数据交换格式
    • 具有自我描述性
    • 比XML传输速度快
      JSON最初用来表示JavaScript中的对象
JSON相互转换
public class Test {
    public static void main(String[] args) {
        Student student=new Student();
        student.setName("张三");
        student.setAge(18);

        student.setHobby(new String[]{"篮球", "足球", "乒乓球"});

        
        System.out.println(student);
        //对象如何转换成 Json 字符串
        String str = JSONObject.toJSONString(student);
        System.out.println(str);
        
        System.out.println("Json字符串转对象-------------------------------");
        //Json字符串如何转对象  解析对象
        Student s1 = JSONObject.parseObject(str, Student.class);
        System.out.println(s1.toString());
    }
}

重写toString()方法

import java.util.Arrays;

public class Student {
    private String name;
    private Integer age;
    private String[] hobby;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public String[] getHobby() {
        return hobby;
    }

    public void setHobby(String[] hobby) {
        this.hobby = hobby;
    }

    @Override
    public String toString() {
        return "{" +
                "\"name\":\"" + name + '\"' +
                "\", age\":" + age +
                ", \"hobby\":" + Arrays.toString(hobby) +
                '}';
    }
}
文章来源:https://blog.csdn.net/m0_69005620/article/details/135153664
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。