XML基础

1.xml概述

  XML全称为Extensible Markup Language,意思是可扩展的标记语言。java

  XML的做用是存放数据,配置文件spring

2.xml的文件要求

  文档声明格式:sql

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

文档声明必须为<?xml开头,以?>结尾ui

文档声明必须从文档的0行0列位置开始编码

文档声明只有两个属性spa

  version:指定xml文档版本,必须属性,由于咱们不会选择1.1,只会选择1.0code

  encoding:指定当前文档的编码,可选属性,经常使用值是UTF-8orm

3.xml的元素

  元素:elementxml

元素是xml文档中最重要的组成部分

普通元素的结构开始标签,元素体,结束标签组成.

  <hello>你好</hello>

元素体能够是元素,也能够是文本

  <a><b>你好</b></a>

空元素只有开始标签,但元素必须本身闭合,<c/>

元素命名:区分大小写,不能使用空格,不能使用冒号,

必须只有一个跟元素

4.xml的属性

 属性:attribute

属性是元素的一部分,它必须出如今元素的开始标签中

属性的定义格式,属性名=属性值,其中属性值必须使用单引或双引

一个元素能够有n个属性,但一个元素不能出现同名属性

属性名不能使用空格,冒号等特殊字符,必须以字母开头

xml注释

xml的注释,<!-- -->

转义字符

 

 CDATA

 

<![CDATA[
            <bean id="xx" className="xx">
                <property name="xx" value="xx" >
                    1 &lt; 3  &gt;  &amp;  &quot;  &apos;
                </property>
            </bean>
        ]]>

5.xml的约束

  在xml中,能够编写一个文档来约束一个xml文档的书写规范,这称之为xml约束

 常见都有DTD,Schema

经过约束文档,能够编写出具备固定格式,规定格式的xml文档

6.DTD案例代码

DTD

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

<!ELEMENT beans (bean*,import*) >

<!ELEMENT bean (property*)>

<!ELEMENT property (#PCDATA)>

 

<!ELEMENT import (#PCDATA)>

 

<!ATTLIST bean id ID #REQUIRED

               className CDATA #REQUIRED

               type CDATA #IMPLIED

 

<!ATTLIST property name CDATA #REQUIRED

                  value CDATA #REQUIRED

 

<!ATTLIST import resource CDATA #REQUIRED>



XML

 

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans SYSTEM "bean.dtd">
<beans>
    <bean id="b001" className="">
        <property name="" value=""></property>
        <property name="" value=""></property>
        <property name="" value=""></property>
        <property name="" value=""></property>
    </bean>
    <bean id="b002" className=""></bean>
    <bean id="b003" className=""></bean>
    <bean id="b004" className=""></bean>
    
    
    <import resource=""></import>
    <import resource=""></import>
    <import resource=""></import>
    <import resource=""></import>
</beans>

 

 

元素声明

 

7.Schema约束

Schema是新的XML文档约束;

Schema要比DTD强大不少,是DTD 替代者;

Schema自己也是XML文档,但Schema文档的扩展名为xsd,而不是xml。

Schema 功能更强大,数据类型更完善

Schema 支持名称空间

<?xml version="1.0" encoding="UTF-8"?>
<!-- 
    模拟spring规范,若是开发人员须要在xml使用当前Schema约束,必须包括指定命名空间。
    格式以下:
    <beans xmlns="http://www.itcast.cn/bean"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.itcast.cn/bean bean-schema.xsd"
    >
-->
<schema xmlns="http://www.w3.org/2001/XMLSchema" 
        targetNamespace="http://www.itcast.cn/bean"
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        xmlns:tns="http://www.itcast.cn/bean" 
        elementFormDefault="qualified">
    <!-- 声明根标签 -->
    <element name="beans">
        <complexType>
            <choice minOccurs="0" maxOccurs="unbounded">
                <element name="bean">
                    <complexType>
                        <sequence minOccurs="0" maxOccurs="unbounded">
                            <element name="property">
                                <complexType>
                                    <attribute name="name" use="required"></attribute>
                                    <attribute name="value" use="required"></attribute>
                                </complexType>
                            </element>
                        </sequence>
                        <attribute name="id" use="required"></attribute>
                        <attribute name="className" use="required"></attribute>
                    </complexType>
                </element>
                <element name="import">
                    <complexType>
                        <attribute name="resource" use="required"></attribute>
                    </complexType>
                </element>
            </choice>
        </complexType>
    </element>
</schema>

Schema命名空间

  若是一个XML文档中使用多个Schema文件,而这些Schema文件中定义了相同名称的元素时就会出现名字冲突。这就像一个Java文件中使用了import java.util.*和import java.sql.*时,在使用Date类时,那么就不明确Date是哪一个包下的Date了

  总之名称空间就是用来处理元素和属性的名称冲突问题,与Java中的包是同一用途。若是每一个元素和属性都有本身的名称空间,那么就不会出现名字冲突问题,就像是每一个类都有本身所在的包同样,那么类名就不会出现冲突

 

 

声明命名空间

  

默认命名空间:<xxx xmlns=””> ,使用<标签>

显式命名空间:<xxx xmlns:别名=””> , 使用<别名:标签>

    1.一个xml文档中,只能出现一次“默认引用”

        <beans xmlns="名称"

    2.一个xml文档中,能够出现屡次“显示引用”

        <beans xmlns:a="名称a"

               xmlns:b="名称b"

    3.全部引用(默认+显示),都必须肯定xsd文档位置

        <beans xmlns="默认名称"

               xmlns:a="名称a"

               xmlns:b="名称b"

               xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

               xsi:schemaLocation="默认名称   默认位置 

                                        名称a   a位置

                                        名称b   b位置"

Schema基本语法

 声明根标签

        1. <element> 声明元素(标签)

        2. 每个元素必须肯定类型:

            complexType 复杂类型

            simpleType 简单类型,通常不用,大部分都是复杂类型

        3. 须要继续明确子标签出差顺序

            <choice> 选择, ()

            <sequence> 顺序 ,

            <all> 任意

                minOccurs 最少出现次数

                maxOccurs 最大出现次数,unbounded 不限制(没有边)

        4.<attribute>用于给元素声明属性的

            use 设置属性使用, optional可选、required必选

  

<element name="beans">
        <complexType>
            <choice minOccurs="0" maxOccurs="unbounded">
                <element name="bean">
                    <complexType>
                        <sequence minOccurs="0" maxOccurs="unbounded">
                            <element name="property">
                                <complexType>
                                    <attribute name="name" use="optional"></attribute>
                                    <attribute name="value" use="required"></attribute>
                                </complexType>
                            </element>
                        </sequence>
                        <attribute name="id" use="required"></attribute>
                        <attribute name="className" use="required"></attribute>
                    </complexType>
                </element>
                <element name="import">
                    <complexType>
                        <attribute name="resource" use="required"></attribute>
                    </complexType>
                </element>
            </choice>
        </complexType>
    </element>

8.XML解析

  1. DOM:要求解析器把整个XML文档装载到内存,并解析成一个Document对象。

a)     优势:元素与元素之间保留结构关系,故能够进行增删改查操做。

b)     缺点:XML文档过大,可能出现内存溢出显现。

  2.SAX:是一种速度更快,更有效的方法。它逐行扫描文档,一边扫描一边解析。并以事件驱动的方式进行具体解析,每执行一行,都将触发对应的事件。(了解)

a)     优势:处理速度快,能够处理大文件

b)     缺点:只能读,逐行后将释放资源。

9.dom解析原理

  xml DOM将整个xml文档加载到内存,生成一个DOM树,并得到一个Document对象,经过document对象就能够进行DOM操做

  

  1. SaxReader对象

a)     read(…) 加载执行xml文档

  1. Document对象

a)     getRootElement() 得到根元素

  1. Element对象

a)     elements(…) 得到指定名称的全部子元素。能够不指定名称

b)     element(…) 得到指定名称第一个子元素。能够不指定名称

c)      getName() 得到当前元素的元素名

d)     attributeValue(…) 得到指定属性名的属性值

e)     elementText(…) 得到指定名称子元素的文本值

f)      getText() 得到当前元素的文本内容

import java.util.List;

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

public class Dom4jDemo_01 {
    
    @Test
    public void demo01() throws DocumentException{
        
        //1 核心类
        SAXReader saxReader = new SAXReader();
        
        //2 得到Document(整个xml)
        Document document = saxReader.read("beans.xml");
        
        
        //3 得到根元素 beans
        Element rootElement = document.getRootElement();
        
        
        //4 全部子元素 bean
        List<Element> allBeanElement = rootElement.elements("bean");
        for (Element beanEle : allBeanElement) {
            //4.1 bean属性
            String id = beanEle.attributeValue("id");
            String className = beanEle.attributeValue("className");
            System.out.println("bean属性:" + id + " , " + className);
            
            //5 元素property
            List<Element> allPropElement = beanEle.elements("property");
            for (Element propEle : allPropElement) {
                String name = propEle.attributeValue("name");
                String value = propEle.attributeValue("value");
                System.out.println("property属性:" + name + " , " + value);
            }
            
            System.out.println("");
        }
    }
}

被解析的xml文档

<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="beanId01" className="com.learn.domain.User">
        <property name="uid" value="u001"></property>
        <property name="username" value="jack"></property>
    </bean>
    
    <bean id="beanId02" className="com.learn.domain.Book">
        <property name="bid" value="b001"></property>
        <property name="title" value="标题"></property>
    </bean>

</beans>
相关文章
相关标签/搜索