XML 學習

1、什麼是XML

一、 XML是一種可擴展的標記語言
二、 XML設計的宗旨是用來傳輸數據的不是用來顯示數據的
三、 XML具備自我描述性,並無固定的標籤,都由本身來自定義,XML的標籤較爲嚴格,不容許有錯。
四、 XML遵循w3c標準。
五、 XML的用途: 數據存儲、數據傳輸、配置文件。
複製代碼

2、基本語法

一、文檔聲明

<?xml version="1.0" encoding="UTF-8"?> <!-- 文檔申明 -->
// 版本號 + 編碼方式 
// 該句話必須放置在第一行
複製代碼

二、規則

一、 標籤必須閉合
二、 必須有跟元素包裹
三、 標籤閉合要對應
四、 區分大小寫
五、 屬性要用雙引號
六、 能夠使用實體符號 &gt;等
複製代碼

三、元素/標籤命名規則

一、 命名能夠包含字母、數字、符號
二、 不能以數字和符號開頭
三、 名稱不能包含空格
四、 不能以xml或XML或Xml開頭
複製代碼

四、文本

<?xml version="1.0" encoding="UTF-8"?> <!-- 文檔申明 -->

<teamp>
	<person>
		<name>zjj</name>
		<age>22</age>
		<gao>
			<abc>aaa</abc>
		</gao>
	</person>
	
</teamp>
複製代碼

// 原樣子輸出
<?xml version="1.0" encoding="UTF-8"?> <!-- 文檔申明 -->

<teamp>
	<person>
		<name>zjj</name>
		<age>22</age>
		// 原樣子輸出
		<![CDATA[
			<abc>aaa</abc>
		]]>
	</person>
	
</teamp>
複製代碼

五、XML樹結構

<bookstore>
<book category="COOKING">
  <title lang="en">Everyday Italian</title> 
  <author>Giada De Laurentiis</author> 
  <year>2005</year> 
  <price>30.00</price> 
</book>
<book category="CHILDREN">
  <title lang="en">Harry Potter</title> 
  <author>J K. Rowling</author> 
  <year>2005</year> 
  <price>29.99</price> 
</book>
<book category="WEB">
  <title lang="en">Learning XML</title> 
  <author>Erik T. Ray</author> 
  <year>2003</year> 
  <price>39.95</price> 
</book>
</bookstore>
複製代碼

3、XML約束

規定文檔中只能些哪些標籤,會報錯提示。php

- DTD約束
    - 本地dtd       <!DOCTYPE root SYSTEM "student.dtd">
    - 引用網絡dtd   <!DOCTYPE root PUBLIC "//UNKNOWN/" "unknown.dtd">
    
- Schema
    - 爲何要使用schema,由於若是咱們想要控制文本的類型,dtd就顯得很差實現了,因此咱們使用了shcema,schema有dtd的功能,還能實現比dtd更多的功能。
複製代碼
  • DTD解析

案例1java

// student.dtd

<!ELEMENT students (student*)>
<!ELEMENT student (name, age)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT age (#PCDATA)>
<!ATTLIST student number ID #REQUIRED>
複製代碼
// student.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root SYSTEM "student.dtd">

<root>
	<students>
		<student number="s001">
			<name>zjj</name>
			<age>21</age>
		</student>
	</students>
	
	<students>
		<student number="s002">
			<name>zjj</name>
			<age>21</age>
		</student>
	</students>
	
	<person>
		<cat>ccc</cat>
	</person>
</root>
複製代碼

案例2web

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

<!DOCTYPE root SYSTEM "web-app.dtd">

<root>
	<web-app>
		<servelt>
			<servelt-name>name</servelt-name>
			<servelt-class>aaaaa</servelt-class>
		</servelt>
		
		<servelt>
			<servelt-name>name</servelt-name>
			<servelt-class>aaaaa</servelt-class>
		</servelt>
		
		<servelt-mapping>
		
		</servelt-mapping>
		
		<servelt-mapping>
		
		</servelt-mapping>
		
		<wel-file-list>
			<welcome-file>aaa</welcome-file>
		</wel-file-list>
	</web-app>
</root>
複製代碼
<! ELEMENT web-app (servelt*, servelt-mapping*, wel-file-list?)>
<! ELEMENT servelt (servelt-name, description?, (servelt-class|jsp-file))>
<! ELEMENT servelt-name (#PCDATA)>
<! ELEMENT welcome-file-list (welcome-file+)>


複製代碼
  • 使用schema

案例bash

// student.xml

<?xml version="1.0" encoding="UTF-8"?>
<!-- 開始使用的步驟: 1.編寫根標籤 students 2.引用約束地址 xsi:schemaLocation="默認空間 約束地址.xsd" 3.引用實例名稱空間 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4.默認名稱空間 xmlns="http://www.it666.cn/xml" -->

<students xsi:schemaLocation="http://www.it666.cn/xml student.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.it666.cn/xml">

<student number="lk_0001">
	<name>aa</name>
	<age>50</age>
	<sex>male</sex>
</student>


</students>
複製代碼
// student.xsd

<?xml version="1.0"?>

<!-- 定義schema根元素,指定默認空間、實例名稱空間等 -->
<xsd:schema xmlns="http://www.it666.cn/xml"
        	xmlns:xsd="http://www.w3.org/2001/XMLSchema"
        	targetNamespace="http://www.it666.cn/xml" elementFormDefault="qualified">
        	
        	
    <!-- 定義一個標籤(元素element) -->
    <xsd:element name="students" type="studentsType"/>  <!-- type爲別名 -->
    <!-- 定義一個標籤 -->
    
    
    
    <!-- 定義一個複雜類型(複雜標籤:標籤當中還有子標籤) name指明瞭別名-->
    <xsd:complexType name="studentsType">
    	<!-- sequence表示必須按照順序 -->
        <xsd:sequence>
        	<!-- students 裏面能夠包含student元素,能夠是0個,最大是無限個 -->
            <xsd:element name="student" type="studentType" minOccurs="0" maxOccurs="unbounded"/>
        </xsd:sequence>
        <!-- 必須按照順序 -->
    </xsd:complexType>
    <!-- 定義一個複雜類型(複雜標籤:標籤當中還有子標籤) -->
    
    
    <!-- 複雜類型 -->
    <xsd:complexType name="studentType">
        <xsd:sequence>
            <xsd:element name="name" type="xsd:string"/>
            <xsd:element name="age" type="ageType" />
            <xsd:element name="sex" type="sexType" />
        </xsd:sequence>
        
        <!-- 別名是studentType的標籤包含的屬性 -->
        <!-- 名稱是number,類型是numberType,必須包含 -->
        <xsd:attribute name="number" type="numberType" use="required"/>
        <!-- 別名是studentType的標籤包含的屬性 -->
        
    </xsd:complexType>
    <!-- 複雜類型 -->
    
    <!-- =============下面指明瞭類型的詳情============== -->
    
    
    <!-- 簡單類型: 簡單標籤(標籤當中沒有子標籤了) -->
    <!-- sex類型: 字符串、枚舉 male 和 female -->
    <xsd:simpleType name="sexType">
        <xsd:restriction base="xsd:string">
            <xsd:enumeration value="male"/>
            <xsd:enumeration value="female"/>
        </xsd:restriction>
    </xsd:simpleType>
    <!-- 簡單類型 -->
    
    <!-- 簡單類型 -->
    <!-- age類型:整形、最小是0,最大是256 -->
    <xsd:simpleType name="ageType">
        <xsd:restriction base="xsd:integer">
            <xsd:minInclusive value="0"/>
            <xsd:maxInclusive value="256"/>
        </xsd:restriction>
    </xsd:simpleType>
    <!-- 簡單類型 -->
    
    <!-- 簡單類型 -->
    <!-- number類型:字符串、正則匹配必須正確 -->
    <xsd:simpleType name="numberType">
        <xsd:restriction base="xsd:string">
            <xsd:pattern value="lk_\d{4}"/>
        </xsd:restriction>
    </xsd:simpleType>
    <!-- 簡單類型 -->
    
</xsd:schema> 

複製代碼

4、XML解析

一、XML樹結構

節點分析以下:

二、DOM解析

認識DOM方式網絡

DOM解析app

package parse;

// 導入
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
import java.io.IOException;
import javax.xml.parsers.DocumentBuilder;


public class ParseClass {
	
	
	
	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
		// TODO Auto-generated method stub
		// 一、建立解析器工廠
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		
		// 二、經過解析器工廠建立解析器
		DocumentBuilder db = dbf.newDocumentBuilder();
		
		// 三、經過解析器獲得文檔對象
		Document doc = db.parse("src/parse/student.xml");
		
		// 四、根據節點名稱得到節點
		NodeList allStu = doc.getElementsByTagName("student");
		
		// 五、獲取第一個學生
		Node n1 = allStu.item(0);
		
		System.out.println(n1.getTextContent()); // zjj21
		
	}

}

複製代碼

DOM 操做dom

package parse;

import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.TransformerFactoryConfigurationError;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class ParseClass {
	
	
	
	/**
	 * 獲取節點內容
	 * @param doc
	 */
	public static void test1(Document doc) {
		// 四、根據節點名稱得到節點
		NodeList allStu = doc.getElementsByTagName("student");
		
		// 五、獲取第一個學生
		Node n1 = allStu.item(0);
		
		System.out.println(n1.getTextContent()); // zjj21
	}
	
	/**
	 * 修改節點內容
	 * @param doc
	 * @throws TransformerFactoryConfigurationError 
	 * @throws Exception 
	 */
	public static void test2(Document doc) throws TransformerFactoryConfigurationError, Exception {
		// 四、獲取全部指定節點
		NodeList ageList = doc.getElementsByTagName("age");
		
		// 五、獲取指定節點 
		Node n1 = ageList.item(0);
		
		// 六、修改節點內容
		n1.setTextContent("300");
		
		// 七、從內從更新到文件中
		Transformer tf = TransformerFactory.newInstance().newTransformer();
		tf.transform(new DOMSource(doc), new StreamResult("src/parse/student.xml"));
	}
	
	/**
	 * 添加節點
	 * @param doc
	 * @throws TransformerFactoryConfigurationError
	 * @throws Exception
	 */
	static void test3(Document doc) throws Exception, TransformerFactoryConfigurationError {
		 // 建立一個元素
		 Element element = doc.createElement("address");
		 
		 // 設置內容
		 element.setTextContent("address");
		 
		 // 插入
		 Node stuNode = doc.getElementsByTagName("student").item(0);
		 stuNode.appendChild(element);
		 
		 
		 // 從內從更新到文件中
		 Transformer tf = TransformerFactory.newInstance().newTransformer();
		 tf.transform(new DOMSource(doc), new StreamResult("src/parse/student.xml"));
	}
	
	/**
	 * 刪除節點
	 * @param doc
	 * @throws Exception
	 * @throws TransformerFactoryConfigurationError
	 */
	static void test4(Document doc) throws Exception, TransformerFactoryConfigurationError {
		Node addressNode = doc.getElementsByTagName("address").item(0);
		addressNode.getParentNode().removeChild(addressNode);
		Transformer tf = TransformerFactory.newInstance().newTransformer();
		tf.transform(new DOMSource(doc), new StreamResult("src/parse/student.xml"));
	}
	
	/**
	 * 設置屬性
	 * @param doc
	 * @throws Exception
	 * @throws TransformerFactoryConfigurationError
	 */
	static void test5(Document doc) throws Exception, TransformerFactoryConfigurationError {
		Node stu = doc.getElementsByTagName("student").item(1);
		Element ele = (Element)stu;
		ele.setAttribute("ID", "00001");
		Transformer tf = TransformerFactory.newInstance().newTransformer();
		tf.transform(new DOMSource(doc), new StreamResult("src/parse/student.xml"));	
	}
	
	/**
	 * 主函數
	 * @param args
	 * @throws TransformerFactoryConfigurationError
	 * @throws Exception
	 */
	public static void main(String[] args) throws TransformerFactoryConfigurationError, Exception {
		// TODO Auto-generated method stub
		// 一、建立解析器工廠
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		
		// 二、經過解析器工廠建立解析器
		DocumentBuilder db = dbf.newDocumentBuilder();
		
		// 三、經過解析器獲得文檔對象
		Document doc = db.parse("src/parse/student.xml");
		test1(doc);
		test2(doc);
//		test3(doc);
//		test4(doc);
		test5(doc);
		
	}

}

複製代碼

可是目前都不使用該種方法了,由於這種方法是java自帶的,由sun公司推出的。yii

三、dom4j解析

dom4j使用步驟:jsp

使用案例:函數

package dom4j;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.io.Writer;
import java.util.List;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

public class Test {
	/**
	 * 寫入信息
	 * @throws Exception
	 * @throws FileNotFoundException
	 */
	static void test() throws Exception, FileNotFoundException {
		// 建立解析器
		SAXReader reader = new SAXReader();
        Document doc = reader.read("src//dom4j//student.xml");
		// 獲取根元素
        Element rootElement = doc.getRootElement();
		// 建立元素,設置屬性並添加進去
        Element stuEle = rootElement.addElement("student").addAttribute("number", "a0003");
        
        // 設置文本信息
		stuEle.addElement("name").setText("zjjjj");	 
		stuEle.addElement("age").setText("30");	 
		stuEle.addElement("sex").setText("男");	 
		
		// 格式化輸出到xml文件中去
        OutputFormat format = OutputFormat.createPrettyPrint();
        Writer wr = new OutputStreamWriter(new FileOutputStream("src//dom4j//student.xml"),"UTF-8");
        XMLWriter writer = new XMLWriter(wr, format);
        writer.write( doc );
        wr.close();
	}
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		System.out.println("-----");
		// 建立SAXReader解析器
		SAXReader reader = new SAXReader();
        Document document = reader.read("src//dom4j//student.xml");
        
        // 獲取根元素
        Element root = document.getRootElement();
        
        // 獲取指定元素,返回集合
        List <Element> list = root.elements("student");
        // 遍歷
        for (Element element : list) {
			String name = element.elementText("name");
			String age = element.elementText("age");
			String num = element.attributeValue("number");
			System.out.println(name);
			System.out.println(age);
			System.out.println(num);
		}
        
        test();
	}

}

複製代碼

java XML 教程

未完待續!!

相關文章
相關標籤/搜索