xml教程

XML基礎語法

和html超文本語言一樣,只不過xml主要作用是存儲數據,和配置文件作用

xml創建

<?xml version="1.0" encoding="UTF-8" ?>  //必寫,定義xml版本和編碼格式
<!DOCTYPE students SYSTEM  "student.dtd">//約束的一種(這是dtd約束),還有一種是schema約束

<students>
	<student number="s0001">
		<name>zs</name>
		<age>abc</age>
		<sex>yao</sex>
	</student>

</students>
DTD約束

DTD語法簡單,但是約束力不強,如性別只能男和女這些不能約束

<!ELEMENT students (student*) > //開頭第一個定義根元素,唯一!
<!ELEMENT student (name,age,sex)>//students的子元素,其中student下有name,age,sex子標籤
<!ELEMENT name (#PCDATA)> 
<!ELEMENT age (#PCDATA)>
<!ELEMENT sex (#PCDATA)>
<!ATTLIST student number ID #REQUIRED> //創建屬性number在student中,並且必需,和不能重複!

schema約束

schema語法難,約束力強大,在框架的配置中經常用到

<?xml version="1.0"?>
<xsd:schema xmlns="http://www.itcast.cn/xml" 		//命名空間 xml在引用約束的地址,隨便寫,不過一般用網址名稱 
        xmlns:xsd="http://www.w3.org/2001/XMLSchema"	//名稱空間 有了命名空間可以直接使用<xsd XXX>來使用不同schema約束文件的,簡化格式。
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"//引入shema約束,名稱空間 實際地址
    <xsd:element name="students" type="studentsType"/>	//定義元素,type就當是id的意思
    <xsd:complexType name="studentsType">	//給type叫studentsType的標籤進行描述
        <xsd:sequence>	//序列,標籤順序
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>//最小0,最大無界
        </xsd:sequence>
    </xsd:complexType>
    <xsd:complexType name="studentType">	//給type叫studentsType的標籤進行描述
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>	//字符串類型
            <xsd:element name="age" type="ageType" />	
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        <xsd:attribute name="number" type="numberType" use="required"/>
    </xsd:complexType>
    <xsd:simpleType name="sexType">	//給type叫sexType的標籤進行描述
        <xsd:restriction base="xsd:string">	//限制文本輸入
            <xsd:enumeration value="male"/>	//男
            <xsd:enumeration value="female"/>	//女
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>	//最小
            <xsd:maxInclusive value="256"/>	//最大
        </xsd:restriction>
    </xsd:simpleType>
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="itcast_\d{4}"/>	//正則:必需是itcast_4個數字格式
        </xsd:restriction>
    </xsd:simpleType>
</xsd:schema> 

xmlns:XXX 名稱空間

標籤<XXX:name>使用XXX約束的name元素(可以把XXX取消掉,直接用<name>元素,如果約束過多,還是帶上<XXX:name>)

xsi:schemaLocation 引用schema地址,格式 名稱空間 空格 命名空間(本地或者網絡)

XML解析

無非是讀,寫


DOM:將文檔加載內存,形成一顆dom樹,將文檔的各個組成部分封裝成對象

優點:在內存形成dom樹,可以對dom進行增刪改查

缺點:dom佔內存,過大xml速度會慢

Document

Element

Text

Attribute

Comment

SAX:逐行讀取,基於事件驅動

優點:不佔內存,速度快

缺點:只能讀取,不能回寫

startDocument

startElement

characters

endElement

endDocument

XML常用的解析器:

JAXP:sun公司提供的,支持dom和sax(sun公司自己都不用···)

JDOM:創建後分家,就出現底下那個

DOM4J:dom for java民間方式,非常好。支持dom

1.導入jar包dom4j.jar

2.創建解析器

SAXReader reader =new SAXReader();

3.解析xml獲取document對象

Document document=reader.read(url);

DOM4j:

dom4j教程看https://dom4j.github.io/(簡單哦了)

    public Document parse(URL url) throws DocumentException {	
        SAXReader reader = new SAXReader();
        Document document = reader.read(url);//把xml加載dom到內存中
        return document;//返回document對象
    }
public void bar(Document document) throws DocumentException {

    Element root = document.getRootElement();//獲得根節點

    // iterate through child elements of root 遍歷root的子節點
    for (Iterator<Element> it = root.elementIterator(); it.hasNext();) { 	//這種寫法我挺支持的Iterator寫在裏面,用完就銷燬。是個好技巧
        Element element = it.next();
        // do something		
    }

    // iterate through child elements of root with element name "foo"
    for (Iterator<Element> it = root.elementIterator("foo"); it.hasNext();) {
        Element foo = it.next();
        // do something
    }

    // iterate through attributes of root
    for (Iterator<ttribute> it = root.attributeIterator(); it.hasNext();) {
        Attribute attribute = it.next();	//獲得屬性
        // do something
    }
 }
public void treeWalk(Element element) {//遞歸xml遍歷出所有的元素
	System.out.println(element.getName);
    for (int i = 0, i<element.nodeCount();i++) {
        Node node = element.node(i);
        if (node instanceof Element) {//判斷是否是Element,是就遞歸,繼續遍歷元素裏面的元素
            treeWalk((Element) node);
        }
    }
}


XPATH:是一門在xml文檔中查找信息的語言

1.引入jaxen-1.1.6.jar

2.document.方法:

selectSingleNode("/書架/書[1]/書名") //尋找元素帶書架下的第一個書元素的書名元素

selectNodes("//*") //遍歷所有的標籤,比dom4j的遞歸遍歷簡單多了

//爲根目錄下並且忽略深度,*代表所有元素

//@id 忽略深度匹配屬性<bbb id="b1"/>

//BBB[@id] 忽略深度匹配BBB元素帶id屬性的元素

//BBB[not(@*)] 忽略深度匹配BBB元素不帶屬性的元素





發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章