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>
相關文章
相關標籤/搜索