Java基础进阶02-xml

一、XML(可拓展标记语言)

1.学习网站:

https://www.w3schoo1.com.cn

  • 标记语言:通过标签来描述数据的一门语言(标签有时我们也将其称之为元素)

  • 可扩展:标签的名字是可以自定义的

2.作用

  • 用于进行存储数据和传输数据

  • 作为软件的配置文件

3.XML标签

  • 标签由一对尖括号和合法标识符组成 < user >

  • 标签必须成对出现< user >< user/>

  • 特殊的标签可以不成对,但是必须有结束标记< user/ >

  • 标签中可以定义属性,属性和标签名空格隔开属性值必须用引号(单/双)引起来< user id = "100"/>

  • 标签需要正确的嵌套

4.XML语法

  • 后缀名为.xml

  • 文档声明必须是第一行第一列

<?xmlversion="1.0”encoding="UTF-8" standalone= “yes”?>
其中
version属性必须存在
encoding属性不是必须的,作用:打开当前xml文件的时候应该是使用什么字符编码表(默认都是UTF-8)
standalone属性不是必须的,作用:描述XML文件是否依赖其他的xml文件,取值为yes/no
  • 必须存在根标签

  • XML文件中可以定义注释信息

  • XML文件中可以存在以下特殊字符

&lt;-----------------小于
&gt;-----------------大于
&amp;----------------和号(&)
&apos;---------------单引号
&quot;---------------引号
  • XML可以存在CDATA区

<![CDATA[ ...内容...]]>

5.解析XML

(1)常见解析思想DOM
  • DOM(DocumentObject Model)文档对象模型:

就是把文档的各个组成部分看做成对应的对象,会把xmI文件全部加载到内存在内存中形成一个树形结构,再获取对应的值

其中DOM对象主要有以下部分

  • Document对象:整个xml文档

  • Element对象:所有标签

  • Attribute对象:所有属性

  • Text对象:所有文本内容

其中Element,Attribute,Text有一个共同的父类:Node对象

6.常见的解析工具

  • JAXP:SUN公司提供的一套XML的解析的API

  • JDOM:开源组织提供了一套XML的解析的API-jdom

  • DOM4J:开源组织提供了一套XML的解析的API-dom4j

  • pull :主要应用在Android手机端解析XML

7.DOM4j的使用

首先下载jar包

xml文件

<?xml version="1.0" encoding="utf-8" ?>
<books>
    <book id="1">
        <name>语文</name>
        <versions>人教版</versions>
    </book>
    <book id="2">
        <name>数学</name>
        <versions>人教版</versions>
    </book>
    <book id="3">
        <name>数学</name>
        <versions>苏教版</versions>
    </book>
    
    <user id="1">
        <name>小明</name>
        <studentID>1235354</studentID>
    </user>
</books>

需求:

  • 解析这个xmI文件

  • 将解析到的Book标签数据封装到Book对象中并将其存储到ArrayList集合中

  • 遍历集合

解析类:

public class Analysis {
​
    public Document parseUrl(String url) throws DocumentException {
        SAXReader reader = new SAXReader();
        return reader.read(url);
    }
    public Document parseUrl(File file) throws DocumentException {
        SAXReader reader = new SAXReader();
        return reader.read(file);
    }
​
}

Book类

public class Book {
    private String name;
    private String version;
    private Long id;
​
    public Book() {
    }
​
    public Book(String name, String version, Long id) {
        this.name = name;
        this.version = version;
        this.id = id;
    }
​
    public String getName() {
        return name;
    }
​
    public void setName(String name) {
        this.name = name;
    }
​
    public String getVersion() {
        return version;
    }
​
    public void setVersion(String version) {
        this.version = version;
    }
​
    public Long getId() {
        return id;
    }
​
    public void setId(Long id) {
        this.id = id;
    }
​
    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", version='" + version + '\'' +
                ", id=" + id +
                '}';
    }
}

测试类

public class Application {
    public static void main(String[] args) throws  DocumentException {
​
        File file = new File("reflection\\src\\xml\\bookstores.xml");
        Analysis analysis = new Analysis();
        Document document = analysis.parseUrl(file);
​
        //获取根标签
        Element rootElement = document.getRootElement();
        //通过根标签获取book标签
        //无参elements()获取所有子标签
        List<Element> elements = rootElement.elements();
        System.out.println(elements.size());
        elements.forEach(book -> {
            System.out.println(book.getName());
        });
​
        //有参elements(标签名)可以获取所有的指定子标签
        List<Element> books = rootElement.elements("book");
        System.out.println(books.size());
​
        books.forEach(book -> {
            System.out.println("=====================================");
            //获取属性对应的属性值
            System.out.println(book.attribute("id").getValue());
            //获取该标签下的子标签
            book.elements("name").forEach(name -> {
                //获取标签体的内容
                System.out.println(name.getText());
            });
​
            book.elements("version").forEach(v -> {
                //获取标签体的内容
                System.out.println(v.getText());
            });
        });
        System.out.println("------------------------------------");
​
        //准备封装
        ArrayList<Book> bookArrayList = new ArrayList<>();
        books.forEach(book -> {
            Book book1 = new Book(book.element("name").getText(),
                                    book.element("version").getText(),
                                    Long.valueOf(book.attribute("id").getValue()));
            System.out.println(book1);
            bookArrayList.add(book1);
        });
        //最后检查"
        System.out.println("+++++++++++++++++++++++++++++++++++++++++++++++++++++");
        bookArrayList.forEach(book -> System.out.println(book.toString()));
​
​
​
    }
}

8.文档约束

(1)概述

用来限定xml文件中可使用的标签以及属性

(2)分类
  • DTD

  • schema

(3)DTD约束
  • 创建一个文件,后缀名为.dtd

  • 看xml文件中使用了哪些元素(<!ELEMENT>可以定义元素)

  • 判断元素是简单元素还是复杂元素

    • 简单元素:没有子元素

    • 复杂元素:有子元素的

根据上面的xml写一个DTD约束文件

<!ELEMENT books (book,user)>
<!ELEMENT book (name,version)>
<!ELEMENT user (name,studentID)>
​
<!ELEMENT studentID (#PCDATA)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT version (#PCDATA)>

需要掌握:

  • 能在xml文件中引入dtd约束文档

  • 能够简单阅读约束文档

  • 能根据约束文档写xml文件

(4)引入约束

方式一:引入本地dtd

<?xml version="1.0" encoding="utf-8" ?>
<!--在xml文件中的第二行写入 <!DOCTYPE 根标签名字 SYSTEM(表示引入本地DTD) ‘DTD文件路径’>-->
<!DOCTYPE books SYSTEM 'restrain.dtd'>

方式二:在xml文件内部引入

<?xml version="1.0" encoding="utf-8" ?>
<!--在xml文件中的第二行写入 <!DOCTYPE 根标签名字 [](表示内部引入dtd,[]内写约束内容)>-->
<!DOCTYPE books [] >

方式三:引入网络dtd

<?xml version="1.0" encoding="utf-8" ?>
<!--在xml文件中的第二行写入 <!DOCTYPE 根标签名字 PUBLIC(表示引入网络DTD) “dtd文件名” “dtd文档的url”>-->
<!DOCTYPE books PUBLIC “dtd文件名” “dtd文档的url”>

(5)DTD语法
①定义元素
<!ELEMENT元素名 元素类型>
  • 简单元素

    • EMPTY:表示标签体为空

    • ANY:表示标签体可以为空也可以不为空

    • PCDATA:表示该元素的内容部分为字符串

  • 复杂元素

    • 直接写子元素名称。

    • 多个子元素可以使用”,“或者 ”|" 隔开;

      • ” , ":表示定义子元素的顺序

      • ”|”: 表示子元素只能出现任意一个

        • "?“:零次或一次

        • ” + ":一次或多次

        • " * ":零次或多次;

        • 如果不写则表示出现一次

②定义属性
<!ATTLIST 元素名称 属性名称 属性的类型 属性的约束>
  • 属性的类型

    • CDATA类型:普通的字符串

  • 属性的约束:

    • #REQUIRED:属性是必须的

    • #IMPLIED:属性不是必需的

    • #FIXED value:属性值是固定的value值

  • 21
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值