• XML


    ## XML

    1、概念:Extensible Markup Language  可扩展标记语言

      *  可扩展:标签都是自定义的。<user>  <student>

    2、功能

      *  存储数据

        1、配置文件

        2、在网络中传输

    3、XML与HTML区别

      (*  w3c:万维网联盟)

      1、xml标签都是自定义的,html的标签是预定义的。

      2、xml语法严格,html语法松散

      3、xml存储数据,html展示数据

    4、语法

      *  基本语法:

      1、xm;文档的后缀名:.xml

      2、xml第一行必须写文档声明  <?xml verson='1.0'?>

      3、xml文档中有且仅有一个根标签

      4、属性值必须使用引号引起来(单双引都可以)

      5、标签必须正确关闭

      6、xml标签区分大小写

    <?xml version='1.0' ?>
    
    <users>
    <user id='1'>
    <name>zhangsan</name>
    <age>1</age>
    <gender>male</gender>
    </user>
    
    <user id='2'>
    <name>lisi</name>
    <age>2</age>
    <gender>famale</gender>
    </user>
    </users>

    5、组成部分

      1、文档声明

      格式: <?xml 属性列表 ?>

      属性列表:

      *  version:版本号

      *  encoding:编码格式。高柱解析引擎当前文档的使用的字符集,默认值ISO-8859-1

      *  standalone:是否独立

        *  取值:yes:不依赖其他文件;   no:依赖其他文件

      2、指令(了解):结合CSS

    <?xml version="1.0" encoding="utf-8" ?>
    <?xml-stylesheet type="text/css" href="user.css" ?>
    <users>
        <user id='1'>
            <name>zhangsan</name>
            <age>1</age>
            <gender>male</gender>
        </user>
    
        <user id='2'>
            <name>lisi</name>
            <age>2</age>
            <gender>famale</gender>
        </user>
    </users>
    name{
        color:red;
    }

      3、标签:自定义的标签名

      *  规则:①名称可以包含字母,数字以及其他的字符;②名称不能以数字或者标点符号开始;③名称不能以字母 xnl (或者XML 、xml 等等)开始;④名称不能包含空格

      4、属性

        id属性值唯一

      5、文本:

      *  CDATA区:在该区域中的数据会被原样展示

        *  格式:<![CDATA[  数据 ]]>

    <?xml version="1.0" encoding="utf-8" ?>
    <users>
        <user id='1'>
            <name>zhangsan</name>
            <age>1</age>
            <gender>male</gender>
        </user>
    
        <user id='2'>
            <name>lisi</name>
            <age>2</age>
            <gender>famale</gender>
            <code>
                <!--if(a &lt; b &amp;&amp; a &gt; c){}-->
                <![CDATA[
    if(a < b && a > c){}
    ]]>
    
            </code>
        </user>
    </users>

     6、约束:规定xml文档的书写规则

      *  作为框架的使用者(程序员):

      1、能够在xml中引入约束文档

      2、能够简单读懂约束文档

      *  分类:

      1、DTD:一种简单的约束技术

      2、Schema:一种复杂的约束技术

      *  DTD:

        *  引入dtd文档到xml文档中

          *  内部dtd:将约束规则定义在xml文档中

          *  外部dtd:将约束的规则定义在外部的dtd文件中:

            *  本地 :<!DOCTYPE 根标签名  SYSTEM  “dtd文件的位置”>

            *  网络:<!DOCTYPE 根标签名  PUBLIC  “dtd文件的名字”  “dtd文件的位置URL”>

    <?xml version="1.0" encoding="UTF-8"?>
    <!ELEMENT classrooms (classroom+)>
    <!ELEMENT classroom (grade,classname,students)>
    <!ATTLIST classroom id  ID #REQUIRED>
    <!ELEMENT classname (#PCDATA)>
    <!ELEMENT grade (#PCDATA)>
    <!ELEMENT students (student+)>
    <!ELEMENT student (id,studentname,age)>
    <!ELEMENT id (#PCDATA)>
    <!ELEMENT studentname (#PCDATA)>
    <!ELEMENT age (#PCDATA)>
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE classrooms SYSTEM "class.dtd">
    <classrooms>
        <classroom id="c1">
            <grade>2010</grade>
            <classname>10级计算机应用技术一班</classname>
            <students>
                <student>
                    <id>1</id>
                    <studentname>宋发准</studentname>
                    <age>12</age>
                </student>
                <student>
                    <id>1</id>
                    <studentname>宋发准</studentname>
                    <age>12</age>
                </student>
            </students>
        </classroom>
        <classroom id="c2">
            <grade>2010</grade>
            <classname>10级计算机应用技术二班</classname>
            <students>
                <student>
                    <id>2</id>
                    <studentname>李四</studentname>
                    <age>22</age>
                </student>
                <student>
                    <id>2</id>
                    <studentname>李四</studentname>
                    <age>22</age>
                </student>
            </students>
        </classroom>
    </classrooms>

      *  Schmea

        *  引入:

        1、填写xml文档的根元素

        2、引入xsi前缀  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

        3、引入xsd文件命名空间  

        xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"

        4、为每个xsd约束声明一个前缀,作为标识 xmlns="http://xmlns.jcp.org/xml/ns/javaee"

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
             version="4.0">
    </web-app>

      7、解析:操作xml文档,将文档中的数据读取到内存中

        *  操作xml文档

        1、解析(读取):将文档中的数据读取到内存中

        2、写入:将内存中的数据保存到xml文档中。持久化的存储

        *  解析xml的方式:

        1、DOM:将标记语言文档一次性加载进内存,在内存中会形成一颗DOM树

        *  优点:操作方便,可以对文档进行CRUD的所有操作

        *  缺点:占内存

        2、SAX:逐行读取,基于事件驱动的。 

        *  优点:不占内存。

        *  缺点:只能读取,不能增删改。

        *  xml常见的解析器:

          1、JAXP:SUN公司提供的解析器,支持DOM和SAX两种思想

          2、DOM4J:一款非常优秀的解析器

          3、jsoup:jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址、HTML文本内容。它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQuery的操作方法来取出和操作数据。

          4、PULL:Android操作系统内置的解析器,sax方式的。

        *  jsoup

          * jsoup快速入门

            * 步骤:

            1、导入jar包

            2、获取Document对象

            3、获取对应的标签Element对象

            4、获取数据

    package XML.jsoup;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * Jsoup快速入门
     */
    public class JsoupDemo01 {
        public static void main(String[] args) throws IOException {
            //获取Document对象,根据一个xml文档来获取
            //获取student.xml的path
            //String path = JsoupDemo01.class.getClassLoader().getResource("student.xml").getPath();
            String path = "D:\IntelliJ IDEA 2019.3.1\workspace\WebLearn\src\XML\sour\student.xml";
            //解析xml文档,加载文档进内存,获取dom树--->Document对象
            Document doc = Jsoup.parse(new File(path), "utf-8");
            //获取元素对象 Element对象
            Elements elements = doc.getElementsByTag("name");
            System.out.println(elements.size());//2
            //获取第一个Element对象
            Element element = elements.get(0);
            String name = element.text();
            System.out.println(name);
        }
    }

        *  对象的使用:

          1、Jsoup:工具类,可以解析html或xml文档,返回Document对象

            *  parse:解析html或xml文档,返回Document

              * parse(File in, String charsetName):解析xml或html文件的

              * parse(String html):解析xml或html字符串

              * parse(URL url,int timeoutMillis):通过网络路径来获取指定的xml,html文档对象

          2、Document对象:文档对象,代表内存中的dom树

            *  获取Element对象

              *  getElementById(String id):根据id属性值来获取唯一的element对象

              *  getElementsByTag(String tagName):根据标签名称获取元素对象集合

              *  getElementsByAttribute(String key):根据属性名称来获取元素对象集合

              *   getElementsByAttributeValue(String key,String value):根据对应的属性名,属性值来获取元素对象集合

          3、Elements:元素Element对象的集合。可以当作ArrayList<Element>来使用

          4、Element:元素对象

            1、获取子元素对象

            *  getElementById(String id):根据id属性值来获取唯一的element对象

            *  getElementsByTag(String tagName):根据标签名称获取元素对象集合

            *  getElementsByAttribute(String key):根据属性名称来获取元素对象集合

            *   getElementsByAttributeValue(String key,String value):根据对应的属性名,属性值来获取元素对象集合

            2、获取属性值

            *  String attr(String key):根据属性名称来获取属性值

            3、获取文本内容:

            *  String text():获取文本内容

            *  String html():获取标签体的所有内容(包括子标签的字符串内容)

          5、Node:节点对象

            *  Document和Element的父类

    package XML.jsoup;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.nodes.Element;
    import org.jsoup.select.Elements;
    
    import java.io.File;
    import java.io.IOException;
    
    public class JsoupDemo04 {
        public static void main(String[] args) throws IOException {
            /*
            Element:元素对象
            1、获取子元素对象
            *  getElementById(String id):根据id属性值来获取唯一的element对象
            *  getElementsByTag(String tagName):根据标签名称获取元素对象集合
            *  getElementsByAttribute(String key):根据属性名称来获取元素对象集合
            *   getElementsByAttributeValue(String key,String value):根据对应的属性名,属性值来获取元素对象集合
            2、获取属性值
            *  String attr(String key):根据属性名称来获取属性值
            3、获取文本内容:
            *  String text():获取文本内容
            *  String html():获取标签体的所有内容(包括子标签的字符串内容)
             */
            String path = "D:\IntelliJ IDEA 2019.3.1\workspace\WebLearn\src\XML\sour\student.xml";
            Document doc = Jsoup.parse(new File(path), "utf-8");
            //通过Document对象获取name标签,获取所有的name标签
            Elements eles = doc.getElementsByTag("name");
            System.out.println(eles.size());
            System.out.println("--------------------------");
            Element eles2 = doc.getElementsByTag("student").get(0);
            System.out.println(eles2.getElementsByTag("name").size());
            //获取student对象的属性值
            String number = eles2.attr("number");//不区分大小写
            System.out.println(number);
            //获取文本内容
            System.out.println("--------------------------");
            String text = eles2.text();
            String html = eles2.html();
            System.out.println(text);
            System.out.println("<><><><><><><><><><><>");
            System.out.println(html);
        }
    }

        *  快捷查询方式:

          1、selector:选择器

          *  使用的方法:Elements     select(String cssQuery)

              *  语法:参考Selector类中定义的语法

    package XML.jsoup;
    
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    import org.jsoup.select.Elements;
    
    import java.io.File;
    import java.io.IOException;
    
    /**
     * 选择器查询
     */
    public class JsoupDemo05 {
        public static void main(String[] args) throws IOException {
            String path = "D:\IntelliJ IDEA 2019.3.1\workspace\WebLearn\src\XML\sour\student.xml";
            //解析xml文档,加载文档进内存,获取dom树--->Document对象
            Document doc = Jsoup.parse(new File(path), "utf-8");
            //查询name标签
            Elements elements = doc.select("name");
            //System.out.println(elements);
            //查询id值为id1
            Elements elements1 = doc.select("#id1");
            //System.out.println(elements1);
            //获取students标签并且number属性为0001的age子标签
            //第一步
            Elements element2 = doc.select("student[number='0001']");
            //System.out.println(element2);
            //第二步
            Elements element3 = element2.select("student > age");
            System.out.println(element3);
        }
    }

          2、XPath:XPath即为XML路径语言,它是用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言

          *  使用Jsoup的XPath需要额外导入jar包。

          *  查询w3cschool参考手册,使用xpath的语法完成查询    https://www.w3cschool.cn/xpath/xpath-syntax.html

    package XML.jsoup;
    
    import cn.wanghaomiao.xpath.exception.XpathSyntaxErrorException;
    import cn.wanghaomiao.xpath.model.JXDocument;
    import cn.wanghaomiao.xpath.model.JXNode;
    import org.jsoup.Jsoup;
    import org.jsoup.nodes.Document;
    
    import java.io.File;
    import java.io.IOException;
    import java.util.List;
    
    /**
     * XPath查询
     */
    public class JsoupDemo06 {
        public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
            String path = "D:\IntelliJ IDEA 2019.3.1\workspace\WebLearn\src\XML\sour\student.xml";
            //解析xml文档,加载文档进内存,获取dom树--->Document对象
            Document doc = Jsoup.parse(new File(path), "utf-8");
    
            //根据document对象,创建JXDocument对象
            JXDocument jxDocument = new JXDocument(doc);
            //结合xpath语法查询
            //查询所有的student标签
            /*List<JXNode> jxNodes = jxDocument.selN("//student");
            for (JXNode jxNode : jxNodes) {
                System.out.println(jxNode);
            }*/
            //查询所有student标签下的name标签
            /*List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
            for (JXNode jxNode : jxNodes1) {
                System.out.println(jxNode);
            }*/
            //查询student标签下,带id属性的的name标签
            /*List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]");
            for (JXNode jxNode : jxNodes2) {
                System.out.println(jxNode);
            }*/
            //查询student标签下,带id属性的的name标签,且id属性值为id1
            List<JXNode> jxNodes3 = jxDocument.selN("//student/name[@id='id1']");
            for (JXNode jxNode : jxNodes3) {
                System.out.println(jxNode);
            }
        }
    }
    That which doesn't kill me makes me stronger!
  • 相关阅读:
    [PHP] laravel框架注意bootstrap/cache
    [git] git拉取远程分支代码
    Prometheus监控系统(4)pushgateway及自定义脚本
    k8s 学习
    pxc /Galera Cluster详解
    Percona Monitoring and Management
    etcd获取所有key
    kubernetes Pod驱逐迁移drain用法
    kubernetes etcd数据管理
    办公环境下k8s网络互通方案
  • 原文地址:https://www.cnblogs.com/21seu-ftj/p/12405940.html
Copyright © 2020-2023  润新知