关于XML与Dom4j的知识点总结

XML

概述

是可扩展标记语言(EXtensible Markup Language)
标记:是指标签(Tag)/元素(Element),<标签名></标签名>
可扩展:标签我们可以随意定义
XML是传输数据,而非显示数据

XML与HTML的主要差异

  1. XML 不是 HTML 的替代。
  2. XML 和 HTML 为不同的目的而设计。
  3. XML主要用于保存和传输数据,HTML是显示数据。

XML文件案例实现

需求

编写xml文档,用于描述人员信息,person代表一个人员,id是人员的属性代表人员编号。
人员信息包括age年龄、name姓名、sex性别信息。

实现步骤

<?xml version="1.0" encoding="UTF-8" ?>
<person id="001">
    <age>18</age>
    <name>李四</name>
    <sex></sex>
</person>

使用浏览器打开即可。

XML的作用

  1. XML可以存储数据(也可以传输数据,但是一般都用的json)
  2. XML也可以作为配置文件

XML语法学习

XML的组成元素

XML文件中常见的组成元素有: 文档声明、元素、属性、注释、字符区、转义字符。

文档声明

就是表明这是一个XML文件。文档声明必须写在XML文件的0行0列(左上角)
固定格式:

<?xml version="1.0" encoding="UTF-8" ?>

version代表xml的版本号,encoding是文件编码。

元素Element/标签(Tag)

格式:
格式1:<标签名></标签名>
格式2:<标签名/>
元素是XML文档中最重要的组成部分。
由开始标签、标签体(元素体)、结束标签。其中标签体可以写其他标签(标签嵌套),也可以是文本内容。
空元素即标签体中没有任何内容,那么可以写成自闭合标签,例如: 。
元素命名:

  1. 区分大小写
  2. 不能使用空格冒号等特殊字符
  3. 不建议一XML、xml、Xml开头
  4. 格式良好的XML文件,有且仅有一个根标签(最外层的标签)

属性

<person id="110">
  1. 属性只能写在开始标签中
  2. 格式:属性名=“属性值”
  3. 一个元素可以有无数个属性,但是不能出现同名属性
  4. 属性名不能使用空格,冒号等特殊字符,且必须以字母开头

注释

<!-- 注释内容-->
<?xml version="1.0" encoding="UTF-8" ?>
<person id="001">
    <!--快捷键是ctrl+shift+左斜杠-->
    <!--一个人的信息-->
    <age>18</age>
    <name>李四</name>
    <sex></sex>
</person>

转义字符

< ——&lt
>——&gt
"——&quot
'——&apos
&——&amp

字符区

当大量的转义字符出现在xml文档中时,会使XML文档的可读性大幅度降低。这时如果使用CDATA段就会好一些。

<![CDATA[
 文本数据
  ]]>

XML文件的约束

概念

XML约束就是我们编写XML文件时的标签的规则

DTD约束

DTD文档类型定义,规定我们在编写XML时具体的标签、子标签、属性等

案例实现

bookshelf.dtd

<!ELEMENT 书架 (+)>
<!ELEMENT 书 (书名,作者,售价)><!--约束元素书的子元素必须为书名、作者、售价-->
<!ELEMENT 书名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售价 (#PCDATA)>

book.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 书架 SYSTEM "bookshelf.dtd"><!--指定使用bookshelf.dtd文件约束当前xml文档-->
<书架><>
    <书名>JavaWeb开发教程</书名>
    <作者>张孝祥</作者>
    <售价>100.00</售价>
</>
</书架>

schema约束

也是约束我们的XML文件的,其功能更强大,本身也是XML,后缀名是.xsd

代码实现

bookshelf.xsd

<?xml version="1.0" encoding="UTF-8" ?>
<!--DTD实例文档.将注释中的以下内容复制到要编写的xml的声明下面-->
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.itcast.cn"
           elementFormDefault="qualified">
    <xs:element name='书架'>
        <xs:complexType>
            <xs:sequence maxOccurs='unbounded'>
                <xs:element name='书'>
                    <xs:complexType>
                        <xs:sequence>
                            <xs:element name='书名' type='xs:string'/>
                            <xs:element name='作者' type='xs:string'/>
                            <xs:element name='售价' type='xs:double'/>
                        </xs:sequence>
                    </xs:complexType>
                </xs:element>
            </xs:sequence>
        </xs:complexType>
    </xs:element>
</xs:schema>

book.xml

<?xml version="1.0" encoding="UTF-8" ?>
<书架 xmlns="http://www.itcast.cn"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.itcast.cn bookshelf.xsd">
    <>
        <书名>三国</书名>
        <作者>罗贯中</作者>
        <售价>10.2</售价>
    </>
</书架>

其中schema中给我们的是标签的开始标签,我们需要自己补充完整的结束标签

XML解析

概述

就是通过代码,将XML文件中保存的的数据获取到。

解析方式和解析器和解析并发包

解析方式

  1. DOM解析:将整个XML都加载到内存,进行解析,解析后生成一个Document对象。
    优点:元素与元素之间保留了结构关系,可以直接对标签进行增删改查操作。
    缺点:如果XML文件过大,会造成内训溢出。

  2. SAX解析:扫描XML文档,扫描一行,解析一行,扫描完毕后释放一行。
    优点:速度快,且可以解析大的文件
    缺点:只能读,然后逐行释放资源

  3. PULL解析:是Android系统内置的XML解析方式。

解析器

根据解析方式,提供具体的实现,写出对应的解析代码(代码需要考虑过程中的每个细节)。

解析开发包

对解析器繁琐API的封装,提供了简单方便的的API来操作XML文档。

常见的解析开发包

  1. Dom4j:比较简单的的解析开发包(常用)
  2. JAXP:sun公司提供支持DOM和SAX开发包
  3. JDom:与Dom4j类似
  4. Jsoup:功能强大DOM方式的XML解析开发包,尤其对HTML解析更加方便

Dom4j的基本使用

原理:是将整个XML文档整个加载到内存,生成一个document对象(倒立的DOM树)
引入dom4j的jar包

Dom4j常用方法

  1. SAXReader对象
    new SAXReader() //无参构造
    Document read(String url) //读取XML文件,并生成Document

  2. Document对象
    Element getRootElement() //获取文档中的根标签

  3. Element对象
    List elements([String ele] ) //获得指定名称的所有子元素。可以不指定名称
    Element element([String ele]) // 获得指定名称第一个子元素。可以不指定名称
    String getName() // 获得当前元素的元素名
    String attributeValue(String attrName) // 获得指定属性名的属性值
    String elementText(Sting ele) // 获得指定名称子元素的文本值
    String getText() //获得当前元素的文本内容

案例实现

Dom4j的解析XML示例

public class demo {
    public static void main(String[] args) throws DocumentException {
        //创建核心对象
        SAXReader saxReader = new SAXReader();
        //读取XML配置文件
        Document document = saxReader.read(new File("D:\\Develop\\WorkSpace\\ithema132\\day22\\Books.xml"));
        //取出books根标签
        Element rootElement = document.getRootElement();
        //获取book标签,返回值是一个集合
        List<Element> list = rootElement.elements();
        //遍历该集合
        for (Element element : list) {
            //获取标签名
            String name = element.getName();
            //System.out.println(name);
            //获取属性值
            String string = element.attributeValue("id");
            String string2 = element.attributeValue("出版社");
            System.out.println("ID为:" + string);
            System.out.println("出版社是:" + string2);
            //继续获取子标签
            List<Element> list1 = element.elements();
            for (Element element1 : list1) {
                //获取标签文本
                String name2 = element1.getName();
                System.out.print(name2 + "\t");
                String name1 = element1.getText();
                System.out.println(name1);
            }
        }
    }
}

Dom4j结合XPath解析XML

XPath:称为XML的路径表达式,可以快速的从N层标签中选出我们需要的标签。

XPath使用步骤

  1. 导入jar包(dom4j和jaxen-1.1-beta-6.jar)
  2. 通过dom4j的SaxReader获取Document对象
  3. 利用Xpath提供的api,结合xpaht的语法完成选取XML文档元素节点进行解析操作

XPath相关的API介绍

List selectNodes(“表达式”) //获取所有的符合表达式的元素集合
Element selectSingleNode(“表达式”) //获取所有的符合表达式的唯一元素

XPath语法

  1. 绝对路径表达式
  2. 相对路径表达式
  3. 全文搜索路径表达式
    格式:String xpath1="//子元素//子子元素";
    2个“//”符号,不用逐级写路径,可以直接选取到对应的节点,是全文搜索匹配的不需要按照逐层级
  4. 谓语表达式
发布了34 篇原创文章 · 获赞 9 · 访问量 1277

猜你喜欢

转载自blog.csdn.net/weixin_43616750/article/details/105188476