13.XML

XML概述

  • 可扩展标记语言(XML),一种数据表示格式,常用于传输和存储数据

XML的几个特点和使用场景

  • 纯文本,默认使用UTF-8编码,二是可嵌套
  • 如果把XML内容存为文件,那么它就是一个XML文件
  • 使用场景:XML内容经常被当成消息进行网络传输,或作为配置文件用于存储系统的信息

XML的创建、语法规则

XML的创建

  • 创建一个XML类型的文件,后缀必须使用xml

IDEA创建XML文件的步骤

  • 右键—>new—>File—>xxx.xml

XML的语法规则

  • 文档声明必须是第一行
    image-20221005211331948

  • XML的标签(元素)规则

    • 标签由一对尖括号和合法标识符组成:,必须存在一个根标签,有且只能有一个
    • 标签必须成对出现,有开始,有结束:
    • 特殊的标签可以不成对,但是必须有结束标记,如:
    • 标签中可以定义属性,属性和标签名空格隔开,属性值必须用引号引起来:
  • XML的其他组成

    • XML文件中可以定义注释信息:<!-注释内容-->
    • 可以存在特殊字符:
      image-20221005212304763
    • 可以存在CDATA区:<![CDATA[ ...内容... ]]
<?xml version="1.0" encoding="UTF-8" ?>
<!-- 注释:跟标签有且只有一个-->
<student>
    <name>女儿国王</name>
    <sex>女</sex>
    <hobby>唐僧,追唐僧</hobby>
    <info>
        <age>30</age>
        <addr>女儿国</addr>
    </info>
    <sql>
        select * form user where age &lt; 18;
        <![CDATA[
            select * form user where age < 18;
        ]]>
    </sql>
</student>

XML文档约束方式一:DTD约束[了解]

  • 文档约束:用来限定XML文件中的标签以及属性应该怎么写

image-20221005213338038

<!ELEMENT 书架 (书+)>
<!ELEMENT 书 (书名,作者,售价)>
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE 书架 SYSTEM "data.dtd">
<书架>
    <书>
        <书名>精通javaSE</书名>
        <作者>地雷</作者>
        <售价>99</售价>
    </书>
</书架>
  • DTD缺点:不能约束具体的数据类型

XML文档约束方式二:schema约束[了解]

  • 可以约束具体的数据类型
  • 本身也是个xml文件,编写的更加严谨

image-20221005214133803

XML解析

什么是XML解析?

  • 使用程序读取XML中的数据

两种解析方式

  • SAX解析
  • DOM解析

image-20221006111646765

image-20221006112151089


Dom4J解析XML文件

image-20221006112336484


Dom4J解析XML文件中的各种节点

image-20221006152333766

public class Dom4jHelloWorldDemo1 {
    @Test
    public void parseXMLData() throws Exception {
        //  1.创建一个Dom4j的解析器对象,代表了整个dom4j框架
        SAXReader saxReader = new SAXReader();

        //  2.把XML文件加载到内存中,成为一个document对象
        //Document document = saxReader.read(new File("xml-app\\src\\d1_dom4j\\Contacts.xml")); //  需要通过模块名去定位
        //Document document = saxReader.read(new FileInputStream("xml-app\\src\\d1_dom4j\\Contacts.xml"));
        InputStream is = Dom4jHelloWorldDemo1.class.getResourceAsStream("Contacts.xml");   //  直接去src下寻找文件
        Document document = saxReader.read(is);

        //  3.获取根元素对象
        Element root = document.getRootElement();
        System.out.println(root.getName());

        //  4.拿根元素下的全部子元素对象(一级)
        List<Element> sonEles = root.elements();
        for (Element sonEle : sonEles) {
            System.out.println(sonEle.getName());
        }
        //  拿某个子元素
        Element userEle = root.element("user");
        System.out.println(userEle.getName());
        //  默认提取第一个子元素对象
        Element contact = root.element("contact");
        //  获取子元素文本
        System.out.println(contact.elementText("name"));
        //  去掉前后空格
        System.out.println(contact.elementTextTrim("name"));
        //  根据元素获取属性值
        Attribute idAttr = contact.attribute("id");
        System.out.println(idAttr.getName() + "---" + idAttr.getValue());
        //  直接提取属性值
        System.out.println(contact.attributeValue("id"));
        System.out.println(contact.attributeValue("vip"));
        //  获取当前元素下的子元素对象
        Element email = contact.element("email");
        System.out.println(email.getText());
    }
}

XML解析案例

image-20221006154121484

注意:xml文件要放在src目录下,不然会报错

public class Dom4jTest2 {
    @Test
    public void parseToList() throws Exception {
        //  需求:解析XML中的数据成为一个List集合对象
        //  1.导入框架(完成)
        //  2.创建SaxReader对象
        SAXReader saxReader = new SAXReader();
        //  3.加载XML文件成为document对象
        InputStream is = Dom4jTest2.class.getResourceAsStream("/Contacts.xml");
        Document document = saxReader.read(is);

        //  4.先拿根元素
        Element root = document.getRootElement();
        //  5.提取contact子元素
        List<Element> contactEles = root.elements("contact");
        //  6.准备一个ArrayList集合封装联系人信息
        List<Contact> contacts = new ArrayList<>();
        //  7.遍历Contact子元素
        for (Element contactEle : contactEles) {
            //  8.每个子元素都是一个联系人对象,需要封装
            Contact contact = new Contact();
            contact.setId(Integer.valueOf(contactEle.attributeValue("id")));
            contact.setVip(Boolean.valueOf(contactEle.attributeValue("vip")));
            contact.setName(contactEle.elementTextTrim("name"));
            contact.setGender(contactEle.elementTextTrim("gender").charAt(0));
            contact.setEmail(contactEle.elementText("email"));
            //  9.把联系人对象数据加入List集合
            contacts.add(contact);
        }
        //  10.遍历List集合
        for (Contact contact : contacts) {
            System.out.println(contact);
        }
    }
}

Xpath检索技术

  • XPath使用路径表达式来定位XML文档中的元素节点或属性节点

image-20221006162150306

posted @ 2022-10-11 22:21  啦啦米老鼠  阅读(108)  评论(0)    收藏  举报