XML

XML

  • 概念:可扩展标记语言。(可扩展:自定义标签)

  • 功能

    • 储存数据
    • 在网络中传输:用于系统与系统之间的数据传输。
  • 优点

    • 阅读性强(能描述数据间的结构关系)
  • 语法

    <?xml version='1.0' ?>
    <users>
        <user>
           <name>zhangsan</name>
            <age>23</age>
            <gender>nan</gender>
        </user>
        <user>
           <name>lisi</name>
            <age>18</age>
            <gender>nv</gender>
        </user>
    </users>
    
    • xml文档的后缀名:.xml

    • xml第一行必须定义文档声明

    • 有且仅有一个根标签

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

    • 标签必须正确关闭

    • ==区分大小写==

  • 组成部分

    • 文档声明:xml文件编码要与encoding制定的码表编码一致。
    <?xml 属性列表 ?>
    ★ version:版本号
    ★ encoding:编码方式(当前文档使用的字符集,默认值iso-8859-1)
    ★ standalone:是否独立
       取值: *yes:不依赖其他文件
             *no :依赖其他文件
    
    • 指令:结合css(不用了)

    • 标签:自定义

      规则:①名称不能以数字或者标点符号开始。

      ​ ②名字可以包含字符,数字和其他符号。

      ​ ③名称不能以字母xml开始。

      ​ ==④名称不能包含空格。==

    • 属性:id属性值唯一

    • 文本内容:

      • 转义字符:标签体重出现特殊符号,,那么一定使用转义字符。

        < : &lt; > : &gt;

      • CDATA区(文本区):

        <![CDATA[数据]]> : xml解析器在解析字符区的内容的时候,全部内容都只会当成普通的文本去处理。即使出现了特殊的字符也会当成普通文本。

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

    • 分类:

      • DTD文件约束:一种简单的约束
      //外部DTD文件(约束文件)引入
      <!DOCTYPE students SYSTEM "student.dtd">
      
      //引入网络DTD文件
      <!DOCTYPE 根标签 PUBLIC "dtd文件名" "url地址">
      <!DOCTYPE students PUBLIC "student.dtd">
      
      //在xml文件上编写DTD文件:
      <!DOCTYPE 根标签 >
      
      
- **Schema**:一种复杂的约束

```xml
<?xml version="1.0" encoding="UTF-8" ?>
<students
        xmlns:aa="http://www.w3.org/2001/XMLSchema-instance"
        aa:schemaLocation="http://www.itcast.cn/xml student.xsd"
        xmlns="http://www.itcast.cn/xml">
    <student number="heima_0001">
        <name>zhangsan</name>
        <age>18</age>
        <sex>female</sex>
    </student>
    <student number="heima_0002">
        <name>lisi</name>
        <age>18</age>
        <sex>female</sex>
    </student>
</students>
```

- 使用方法:

  1. 导入文件

  ```xml
  <!--用于引入schemaLocation属性,固定的,可不变-->
  xmlns:aa="http://www.w3.org/2001/XMLSchema-instance"
  <!--指定schema文件位置,其中http://www.itcast.cn/xml中如果为无效路径,后面的student.xsd将提供本地的路径,如果前面网址有效,后面可不写。但是却不可以只写后面-->
  aa:schemaLocation="http://www.itcast.cn/xml student.xsd"
  <!--获取xds文件的路径-->
  xmlns="http://www.itcast.cn/xml">
  ```

  • 解析

  • 操作文档:

    • 解析(读取):将文档中的数据读取到内存中。
    • 写入:将内存中的数据保存到xml文档中。持久化的储存
  • 解析xml的两种思想(方式):

    • DOM:将标记语言文档一次性全部加载进内存,在内存中形成一颗DOM树。
      • 优点:操作方便,可以对文档进行CRUD的所有操作。
      • 缺点:占内存
    • SAX:逐行读取,基于事件驱动的。
      • 优点 : 不占内存
      • 缺点:只能读取内存,不能增删改查。

常见解析器

  • jaxp sun公司研发的,使用比较复杂,而且性能较差,支持sax与dom的思想。
  • dom4j : 使用了dom的思想,非常好用
  • jsoup: 非常好用, 使用dom思想, 支持选择器查找标签。
  • pull : android系统上自带一款解析。 sax思想。

解析器soup

  • 使用步骤:
    1. 导包
    2. 获取Document对象
    3. 获取对应的标签Element对象
    4. 获取数据
public static void main(String[] args) throws IOException {
//      获取路径 ,其中getResource()方法中传入的参数是xml的路径
        String path = demo1.class.getClassLoader().getResource("student.xml").getPath();
//      获取Document对象,解析xml文档,加载文档进内存,获取DOM树
        Document document = Jsoup.parse(new File(path), "utf-8");
//      获取元素对象Elements,这个对象继承了ArrayList集合
        Elements elements = document.getElementsByTag("name");
//      获取elements中的第一个对象
        Element elementFirst = elements.get(0);
//      获取数据
        String name = elementFirst.text();
        System.out.println(name);

    }

==注意:获取路径的时候有两种写法:==

  • 写法一:
String path = demo1.class.getClassLoader().getResource("student.xml").getPath();

​ ==使用getClassLoader方法来传入xml文件路径的方式,xml文件必须要在src文件夹下,不能放到其他的文件夹中。==

  • 写法二:
String path = demo1.class.getResource("/schema/student.xml").getpath();

==直接通过类的字节码文件调用方法getResource()方法获取路径的方式,xml文件的路径写法为/xxx/xxx/student.xml,其中第一个/表示src文件夹.==


解析方式一:Element对象功能

public static void main(String[] args) throws IOException {
        String path = Demo2.class.getClassLoader().getResource("student.xml").getPath();

        Document document = Jsoup.parse(new File(path), "utf-8");

        //获取元素对象
        Elements studentEle = document.getElementsByTag("student");

        // 获取属性名为id的元素对象们-->方式一
        Elements id = document.getElementsByAttribute("id");
        System.out.println(id.text());

        //获取 number属性值为heima_0001的元素对象-->方式一
        Elements elementsByAttributeValue = document.getElementsByAttributeValue("number", "heima_0001");
        String text1 = elementsByAttributeValue.text();
        System.out.println(text1);

        //获取id属性值的元素对象-->方式一
        Element elementById = document.getElementById("1");
        String text2 = elementById.text();
        System.out.println(text2);

        System.out.println("----------------------------------");

        //根据属性名获取属性值
        Element student1 = document.getElementsByTag("student").get(0);
        String number = student1.attr("number");
        System.out.println(number);
        System.out.println("*************");
        //获取文本内容
        String text = student1.text();
        String html = student1.html();
        System.out.println(text);
        System.out.println("**********************************");
        System.out.println(html);
    }

如何通过Element获取标签体与属性的数据

  • 获取属性数据: attr(属性名) 指定属性获取属性值内容。
  • 获取文本的内容:
    • text() 获取的是对应元素的所有纯文本内容,包括子标签的文本内容。
    • html()获取的是对应元素的所有纯文本内容,包括子标签的文本内容,与标签。

使用选择器解析

public static void main(String[] args) throws IOException {
        //使用选择器解析
        String path = Demo2.class.getClassLoader().getResource("student.xml").getPath();

        Document document = Jsoup.parse(new File(path), "utf-8");

        //获取元素对象
        Elements studentEle = document.getElementsByTag("student");

//        查询name标签
        Elements elementsName = document.select("name");
        System.out.println(elementsName);
        System.out.println("--------");
//        查询查询id值为1的元素
        Elements selectId = document.select("#1");
        System.out.println(selectId);
        System.out.println("******");
//       获取student标签并且number属性值为heima_0001
        Elements select2 = document.select("student[number=\"heima_0001\"]");
        System.out.println(select2.text());
          
    }

小结

  • 使用选择器查找元素使用哪个方法?

​ document.select(选择器)

  • 选择器通过id、标签、属性的格式如何?

    • document.select(标签名) 标签选择名
    • document.select(#id) id选择器
    • document.select(.className) 类选择器
    • document.select(标签名[属性名=属性值]) 指定标签名与属性名属性值查找
    • document.select(标签名[属性名]) 指定标签名与属性名查找
    • document.select(parent child) 指定父元素找到所有的子孙元素
    • document.select(parent child) 指定父元素找到所有的子孙元素
    • document.select(parent >child) 指定父元素找到所有的子元素

xpath


public static void main(String[] args) throws IOException, XpathSyntaxErrorException {
        //1.获取student.xml的路径
        String path = Demo4.class.getResource("/student.xml").getPath();
        //2.获取Document对象
        Document document = Jsoup.parse(new File(path), "utf-8");
        //3.根据Document对象创建JXDocument对象(document对象作为参数)。
        JXDocument jxDocument = new JXDocument(document);
//        查询所有student标签
        List<JXNode> jxNodes = jxDocument.selN("//student");
        for (JXNode jxNode : jxNodes) {
            System.out.println(jxNode);

        }
        System.out.println("----------------------");

//        查询所有student标签下的name标签
        List<JXNode> jxNodes1 = jxDocument.selN("//student/name");
        for (JXNode jxNode : jxNodes1) {
            System.out.println(jxNode);
        }
        System.out.println("----------------");

        List<JXNode> jxNodes2 = jxDocument.selN("//student/name[@id]");
        for (JXNode jxNode : jxNodes2) {
            System.out.println(jxNode);
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,589评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,615评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,933评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,976评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,999评论 6 393
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,775评论 1 307
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,474评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,359评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,854评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,007评论 3 338
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,146评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,826评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,484评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,029评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,153评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,420评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,107评论 2 356

推荐阅读更多精彩内容

  • 经过两天的奋战,终于把xml简略的过了一遍。 1.1XML介绍 xml是Extensible Markup lan...
    Ystrator阅读 819评论 0 2
  • 一、XML介绍 XML 指可扩展标记语言(EXtensible Markup Language),也是一种标记语言...
    圣贤与无赖阅读 1,127评论 2 3
  • xml经典总结 XML(eXtensible Markup Language)是万维网联盟(World Wide ...
    java日记阅读 960评论 0 2
  • 课程内容:XML 安装MyEclipse开发工具 * 破解(看图) * 配置 * 配置工作空间的编码(UTF-...
    流年划破容颜_cc55阅读 1,189评论 0 2
  • 1. XML简介 以下内容来自于http://www.w3school.com.cn/xml 基本知识 XML 和...
    WebSSO阅读 1,921评论 1 7