D-25 XML

一、XML

1.1 xml的概述

1.1.1 什么是xml

  1. xml指可扩展标记语言
  2. XML是一种标记语言,类似THML
  3. XML的设计宗旨是传递数据 ,而非显示数据
  4. XML的标签没有事先定义,需要自行定义
  5. XML被设计为具有自我描述性(就是易于阅读)
  6. XML是W3C的推荐标准
    注意: 现在我们学习的还是1.0版本,04年发布的1.1版本向下不兼容,被舍弃。

1.1.2 XML与HTML的主要差异

  • xml不是html的 替代
  • xml和html为不同的目的而设计
  • xml被设计为传输和存储数据,其焦点是数据的内容
  • html被设计用来显示数据, 其焦点是数据的外观
  • html显示信息,xml传输信息。

在这里插入图片描述

1.2 XML的组成

文档声明,元素element,属性,注释,转义字符,字符区

<!--
    xml组成:
    文档声明:
        声明该文件是一个xml文件,声明版本和编码方式
    元素:标签
        标签名称自定义。
        双标签(围堵标签):有开始和结束标签
            eg: <xxxx></xxxx>
        单标签(空标签):eg:<xxx/>
    属性:
        定义在开始标签上
        双标签:属性名称自定义
            <xxx 属性名称="值"  属性名称="值"></xxx>
        单标签(空标签):eg:<xxx 属性名称="值"  属性名称="值"/>
    注释:
        对代码的说明
    转义字符:像大于号,小于号,需要用转义字符
    字符区:
        字符区中的信息不会被转义
-->

代码

<?xml version="1.0" encoding="utf-8" ?>
<persons>
    <person id="001">
        <姓名>Saber</姓名>
        <sex></sex>
        <discription>数学 &lt; 语文</discription>
    </person>
    <person id="002">
        <姓名>Aecher</姓名>
        <sex></sex>
        <discription>
            我知道html的语法格式
            <!--字符区-->
            <![CDATA[
            <<html>
                <<head>
                <title> </title>
                </head>>
                <body>
                <h1>吃香蕉!</h1>
                </body>
            </html>
            ]]]>
        </discription>
    </person>
</persons>

1.3 XML文件的约束

在XML技术中,可以编写一个文档来约束XML文档的书写规范, 称为XML约束。
常见的XML约束:DTD,Schema

1.3.1 DTD约束

语法

<!ELEMENT 标签名字 标签类型>

标签类型

标签类型代码写法说明
PCDATA(#PCDATA)被解释的字符串数据
EMPTYEMPTY即空元素,例如< hr/>
ANYANY即任意类型

代码

<!ELEMENT 书架 (书+)> <!-- 约束根标签的名称为 "书架"  及子标签出现的次数-->
<!ELEMENT  (书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价-->
<!ELEMENT 书名 (#PCDATA)> <!-- PCDATA: 约束标签体信息为字符串  -->
<!ELEMENT 作者 EMPTY> <!-- EMPTY: 约束当前标签为单标签-->
<!ELEMENT 售价 ANY> <!-- ANY: 标签类型任意 -->

引入DTD约束的方式

  1. 内部约束
  2. 外部约束
  3. 公共约束(互联网约束)
<!--内部约束
        <!DOCTYPE 跟标签名称 [dtd约束...]>
  -->
<!--

        <!DOCTYPE 书架 [<!ELEMENT 书架 (书+)>
        <!ELEMENT 书 (书名,作者,售价)>&lt;!&ndash;约束元素书的子元素必须为书名、作者、售价&ndash;&gt;
        <!ELEMENT 书名 (#PCDATA)>
        <!ELEMENT 作者 (#PCDATA)>
        <!ELEMENT 售价 (#PCDATA)>
        ]>
-->
<!--
    外部约束:
        <!DOCTYPE 跟标签名称 SYSTEM "文件名称.dtd">
-->
<!--
    公共约束(互联网约束)
        <!DOCTYPE web-app PUBLIC
        "http://java.sun.com/dtd/web‐app_2_3.dtd">
-->

数量词(掌握)

数量词符号含义
*表示元素可以出现0到多个
+表示元素可以出现至少一个
表示元素可以是0个或1个
,(逗号)表示元素需要按照顺序显示
竖杠(这个打不出来)表示元素需要选择其中的某一个

1.4 Schema约束

概述:
1.Schema比DTD 强大,是DTD代替者
2. Schema本身也是XML文档,单Schema的文档扩展名为XSD
3. Schema功能更强大,数据类型约束更完善
4. Schema可以进一步约束标签体数据的类型
约束文件后缀名: -.xsd
代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!--
    一个xml文件可以被多个schema文件约束
    为了区分不同的约束文件,我们可以 给约束文件起别名
    引入schema约束文件方式、:
        xmlns:xml namespace

-->
<书架
        xmlns="http://www.itcast.cn"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.itcast.cn bookshelf.xsd"
>
    <>
        <书名>西游记</书名>
        <作者>吴承恩</作者>
        <售价>66</售价>
    </>
    </书架>

二 、解析XML

2.1 解析方式和解析器

  • 开发中比较常见的解析方式
    1. DOM:要求把整个XML文档装载到内存,并解析成一个Document对象。
      优点: 元素与元素之间保留结构关系,可以进行增删改查
      缺点: xml文档过大,容易造成内存溢出。
    2. SAX:速度更快 ,更有效的方法。一边扫描一边解析。
      优点: 处理速度快,可以处理大文件。
      缺点: 只能读,读完释放资源,不能进行增删改查、
      1. PULL:Android内置的解析方式,类似SAX.

2.2 DOM4J

 public static void main(String[] args) throws DocumentException {
        //1.导入jar包
        //2.创建核心解析对象
        SAXReader reader = new SAXReader();
        //3.读取文件获取dom对象
        InputStream is = DocumentDemo.class.getClassLoader().getResourceAsStream("books.xml");
        Document document = reader.read(is);
        //4.从dom对象中获取 元素 属性 标签体信息
        Element rootElement = document.getRootElement();
        System.out.println(rootElement);

        System.out.println("-------获取元素的所有子元素-------");
//        格式:List elements([String ele] )
//        获得指定名称的所有子元素。可以不指定名称
        List <Element>list = rootElement.elements("book1");
        for (Element element : list) {
            System.out.println(element);
        }

        System.out.println("-------获取元素的一个子元素-------");
//        Element element(String ele)
//        获得指定名称第一个子元素。
        Element ele = rootElement.element("book");
        System.out.println(ele);

        System.out.println("-------获取元素的名称-------");
//        String getName()
//        获得当前元素的元素名
        String name = rootElement.getName();
        System.out.println(name);
        System.out.println("-------获取元素上属性的值-------");
//        String attributeValue(String attrName)
//        获得指定属性名的属性值
        String aa = rootElement.attributeValue("aa");
        System.out.println(aa);

        System.out.println("-------获取元素子元素标签体的信息-------");
//        String elementText(Sting ele)
//        获得指定名称子元素的文本值
        List<Element> list1 = rootElement.elements();
        for (Element element : list1) {
            System.out.println(element.elementText("name"));
        }


        System.out.println("--------获取当前元素标签体的信息---------");
        List <Element>list2 = rootElement.elements();
        for (Element element : list2) {
            List <Element>list3 = element.elements();
            for (Element element1 : list3) {
                System.out.println(element1.getText());
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值