XML【感谢尚硅谷】

XML

  • 定义:可扩展的标记性语言

    • 可扩展是因为xml中的标签都不是xml本身的,都是可以自定义的

    • students.xml
      <students>
      	<student>
          	<id>1</id>
              <name>yf</name>
          </student>
          <student>
          	<id>2</id>
              <name>zz</name>
          </student>
      </students>
      
  • 作用:

    • 用来保存数据,并且数据具有自我描述性
    • 可以作为项目或者模块的配置文件
    • 还可以作为网络传输数据的格式(现在则以JSON为主)
  • xml教程

示例

  1. 创建xml文件

    • idea中没有新建xml文件的选项,选择file,然后自己写xxxx.xml
  2. 第一个程序

    <?xml version="1.0" encoding="utf-8" ?>
    <!--
        <?xml version="1.0" encoding="utf-8" ?>
        这部分内容表示xml文件的声明
        version表示xml的版本
        encoding表示xml的本身的编码
    -->
    <books>  <!--books表示多个图书信息-->
        <book sn="SN0000001">  <!--book表示一个图书信息 sn属性表示图书序列号-->
            <name>时间简史</name>  <!--name标签表示书名-->
            <author>霍金</author>  <!--author标签表示作者-->
            <price>75</price>  <!--price标签表示价格-->
        </book>
        <book sn="SN0000002">  <!--book表示一个图书信息 sn属性表示图书序列号-->
            <name>基因的奥德赛之旅</name>  <!--name标签表示书名-->
            <author>斯宾塞·韦尔斯</author>  <!--author标签表示作者-->
            <price>58</price>  <!--price标签表示价格-->
        </book>
    </books>
    
  3. 若你的编辑器没有校验功能,可以使用浏览器进行校验

语法介绍

  • 注释:html和xml注释相同

    <!--注释信息-->
    
  • 元素(标签)

    • html中

      • 格式:<标签名>封装的数据</标签名>

      • 单标签:<标签名 />

        <br>  换行
        <hr>  水平线
        
      • 双标签:<标签名>封装的数据</标签名>

      • 标签名大小写不敏感

      • 标签有属性,有基本属性和事件属性

      • 标签要闭合(不闭合html中也不会报错,但是我们要有良好的书写习惯)

    • xml中

      • 定义:元素指的是从(且包括)开始标签直到(且包括)结束标签的部分

      • 元素可包含其他元素、文本或者两者的混合物。元素也可以拥有属性

      • 命名规则:

        • 名称可以包含字母、数字和其他的字符
        • 名称不能以字符"xml"或者"XML"、"Xml"开始
        • 名称不能包含空格(和属性没法区别)
      • 也分为单标签和双标签

        • <books>  <!--books表示多个图书信息-->
              <book sn="SN0000001">  <!--book表示一个图书信息 sn属性表示图书序列号-->
                  <name>时间简史</name>  <!--name标签表示书名-->
                  <author>霍金</author>  <!--author标签表示作者-->
                  <price>75</price>  <!--price标签表示价格-->
              </book>
              <book sn="SN0000002" name="基因的奥德赛之旅" author="斯宾塞·韦尔斯" price="58" />
          </books>
          
  • 属性:

    • 和html中类似,属性可以提供元素的额外信息
    • 在标签上可以书写属性
      • 一个标签可以书写多个属性。属性的值必须使用引号括起来
      • 规则和标签的书写规则一致
  • 语法规则:

    • xml中的元素都必须关闭标签(也就是闭合状态)

    • xml是强语法规则,错了会报错

    • 对大小写敏感

    • 标签必须正确的嵌套

    • xml文档必须有根元素

      • 根元素就是顶级元素
      • 没有父标签的元素,叫顶级元素
      • 根元素就是没有父标签的顶级元素,而且是唯一一个
    • 特殊字符:

在这里插入图片描述

- 在 XML 中,只有字符 "<" 和 "&" 确实是非法的。大于号是合法的,但是用实体引用来代替它是一个好习惯。
  • 文本区域(CDATA区)

    • CDATA语法可以告诉xml解析器,这里的文本内容,只是纯文本,不需要xml语法解析

    • 格式:

      • <![CDATA[这里的可以把你输入的字符原样显示,不会解析xml]]>
        

XML解析技术介绍

  • xml是可扩展的标记语言

  • 不管是html文件还是xml文件,都是标记型文档,都可以使用w3c组织制定的dom技术(标签都会被转化为对象)来解析

  • 解析:读取xml中的数据,转化成我们要用的内容

在这里插入图片描述

  • document对象就表示整个文档(无论是xml还是html)

在这里插入图片描述

  • dom4j是第三方解析技术。我们需要使用第三方给我们提供的类库才能解析xml文件

dom4j

  • 不是sun,也不是甲骨文公司的技术,属于第三方

  • 文件夹介绍

    • docs文件夹下的index.html是dom4j的使用手册
    • lib存放以来的jar包
    • src是dom4j的源码
  • 使用dom4j解析xml,获取document对象

    1. 准备好一个xml文件
    2. 对应的创建一个类文件
      1. 创建对应的属性
      2. 方法
        1. 无参构造
        2. 有参构造
        3. getter and setter
    3. 创建一个lib目录,复制dom4j到目录中,将jar包添加到类路径,选择jar包->右键->add as library
<!--books.xml-->
<?xml version="1.0" encoding="utf-8" ?>
<!--
    <?xml version="1.0" encoding="utf-8" ?>
    这部分内容表示xml文件的声明
    version表示xml的版本
    encoding表示xml的本身的编码
-->
<books>  <!--books表示多个图书信息-->
    <book sn="SN0000001">  <!--book表示一个图书信息 sn属性表示图书序列号-->
        <name>时间简史</name>  <!--name标签表示书名-->
        <author>霍金</author>  <!--author标签表示作者-->
        <price>75</price>  <!--price标签表示价格-->
    </book>
    <book sn="SN0000002">  <!--book表示一个图书信息 sn属性表示图书序列号-->
        <name>基因的奥德赛之旅</name>  <!--name标签表示书名-->
        <author>斯宾塞·韦尔斯</author>  <!--author标签表示作者-->
        <price>58</price>  <!--price标签表示价格-->
    </book>
</books>
// Book.java
package syf;

import java.math.BigDecimal;

public class Book {
    private String sn;
    private String name;
    private BigDecimal price;
    private String author;
    // 快捷键alt+Insert
    // 无参构造
    public Book() {
    }
    // 有参构造
    public Book(String sn, String name, BigDecimal price, String author) {
        this.sn = sn;
        this.name = name;
        this.price = price;
        this.author = author;
    }
    // getter setter方法
    public String getSn() {
        return sn;
    }

    public void setSn(String sn) {
        this.sn = sn;
    }

    public String getName() {
        return name;
    }

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

    public BigDecimal getPrice() {
        return price;
    }

    public void setPrice(BigDecimal price) {
        this.price = price;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    @Override
    public String toString() {
        return "Book{" +
                "sn='" + sn + '\'' +
                ", name='" + name + '\'' +
                ", price=" + price +
                ", author='" + author + '\'' +
                '}';
    }
}
// Dom4jText.java
package syf;

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

import java.util.List;

public class Dom4jText {
    // 导入Test修饰需要加入两个jar包
    // hamcrest-core-1.3.jar和junit-4.12.jar
    @Test
    public void text1() throws Exception {
        // 创建一个SAXReader输入流,去读取xml配置文件,生成Document对象
        SAXReader saxReader = new SAXReader();
        Document document = saxReader.read( "src/books.xml" );
    }
    // 读取books.xml文件,生成book类
    @Test
    public void test2() throws Exception {
        // 1.读取book.xml
        SAXReader reader = new SAXReader();
        // 在Junit测试中,相对路径是从模块名开始算
        Document document = reader.read( "src/books.xml" );
        // 2.通过Dom对象获取根元素
        Element rootElement = document.getRootElement();
        // 3.通过根元素获取book标签对象
        // element和elements都是通过标签名查找子元素
        List<Element> books = rootElement.elements("book");
        // 4.遍历,处理每个book标签转换为book类
        for (Element book : books){
            // asXML()把标签对象转换为标签字符串
            Element nameElement = book.element("name");
            // getText()可以获取标签中的文本内容
            String nameText = nameElement.getText();
            // elementText()直接获取指定标签名的文本内容
            String priceText = book.elementText("price");
            // 获取属性值
            String snValue = book.attributeValue("sn");

            System.out.println(new Book(snValue,nameText));
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值