xml
xml概敘
EXtensible Markup Language 可擴展的標記語言,標記語言:通過一組標籤表示語言,可擴展標記語言:HTML中的標籤都是預定義好.XML允許用戶自定義標籤.
xml的作用
XML出現替換HTML. -XHTML.
XML用來存儲數據(傳遞數據),作爲軟件的配置文件.
XML可以在任何平臺下進行解析的.傳遞數據.(異步系統之間的傳輸數據).
XML可以作爲軟件的配置文件.
xml的使用
文檔聲明:
在XML的文檔的第一行第一列編寫文檔聲明.
語法:<?xml ?>
屬性:
version:版本號.必須的.
encoding:字符集.UTF-8,GBK,GB2312,ISO-8859-1
standalone:依賴外部的文件.yes-代表這個文檔. no-代表這個文檔依賴外部的文檔.
元素:標籤.(可以自定義標籤)
語法:
標籤區分大小寫的.<a> <A>
XML語法比較嚴格,有開始標籤,必須有結束標籤.<book/>
XML的元素名稱.需要以字母開始中間不能使用空格 不能使用:
元素的名稱不能是以XML,xml,Xml開頭.
XML文檔必須有一個跟元素.
屬性:
語法:
不能使用空格,冒號特殊字符.
屬性需要以字母開頭.
屬性必須使用引號.
註釋:
<!-- 註釋 -->
特殊字符和CDATA區:
< <
> >
& &
“ "
‘ '
CDATA:<![CDATA[ 內容 ]]>
xml的解析
XML的解析方式
DOM解析,SAX解析.
針對這兩種方式不同的公司提供了不同的API.
SUN:JAXP.
JDom:Jdom
Dom4J:dom4j
pull解析-主要應用在android.
jsoup解析-主要應用在網絡爬蟲,應用解析HTML的.
dom4j入門
@Test
public void demo1() throws DocumentException{
// 1.創建一個解析器:
SAXReader reader = new SAXReader();
// 2.獲得代表整個文檔的Document對象
Document document = reader.read("src/persons.xml");
// 3.Dom4J獲得XML的跟元素.
Element root = document.getRootElement();
// 4.獲得跟元素以下的其他的元素:
// root.element("person");
Element pElement = (Element) root.elements("person").get(1);
Element nameElement = pElement.element("name");
String name = nameElement.getText();
System.out.println(name);
}
xml解析代碼示例
public class MyServer {
public static void main(String[] args) throws Exception {
// 解析XML 獲得端口號
// 1.創建解析器:
SAXReader reader = new SAXReader();
// 2.讀取文件,獲得文檔對象.
Document document = reader.read("conf/server.xml");
// 3.獲得跟元素:
Element root = document.getRootElement();
// 4.獲得Server元素.
Element connElement = root.element("Server").element("Connector");
String port = connElement.attributeValue("port");
System.out.println(port);
// ServerSocket 對象可以監聽端口
ServerSocket serversocket = new ServerSocket(Integer.parseInt(port));
while(true) {
Socket socket = serversocket.accept(); // 等待客戶端的連接請求,一旦有請求過來,就結束阻塞,返回客戶端對象
//System.out.println(socket.getInetAddress());
// 一旦有客戶來訪問, 就另開一個新線程去提供服務, main線程繼續等待下一個客戶的連接
new Thread(new MyService(socket)).start();
}
}
}
xml約束
xml約束概述
用來規範XML的標籤可以出現哪些標籤,不能出現哪些標籤,標籤之間的順序出現的次數都是由要求的.
引入xml約束
引入方式:一種內部,一種外部
引入內部xml約束
<!DOCTYPE books [
約束
]>
<!DOCTYPE books [
<!ELEMENT books (book+)>
<!ELEMENT book (name,author,price)>
<!ELEMENT name (#PCDATA)>
<!ELEMENT author (#PCDATA)>
<!ELEMENT price (#PCDATA)>
<!ATTLIST book bid ID #REQUIRED>
]>
引入外部xml約束
- 本地:
- 網絡:
DTD語法
* DTD語法:
* 元素:<!ELEMENT 元素名稱 元素組成>
* 元素組成:EMPTY ANY (子元素) (#PCDATA)
* 如果出現子元素:使用?(出現0次或1次),*(出現0次或多次),+(出現1次或多次) 表示子元素出現的個數.使用|或者,規定元素出現的順序. | :代表或 , :代表子元素出現必須按照順序.
* 屬性: <!ATTLIST 元素名稱 屬性名稱 屬性類型 屬性使用規則>
* 屬性類型:ID,枚舉,CDATA
* 使用規則: REQUIRED , IMPLIED ,FIXED
schema約束1
Schema與DTD區別:
1. DTD語法自成一派.Schema就是一個XML文檔.
2. Schema可以更方便被XML的解析器所解析.
3. Schema做了更加強大的語意和語法約束.提供了更多的數據類型.
4. Schema支持名稱空間.
schema約束示例
定義Schema文檔
<?xml version="1.0" encoding="UTF-8"?>
<!--
Schema根標籤 schema
根標籤的三個屬性:
xmlns :xml的namespace.XML的名稱空間.
約束文檔的名稱空間-http://www.w3.org/2001/XMLSchema
targetNamespace:目標名稱空間.-將該約束中定義的元素或屬性綁定到一個名稱空間上.
名稱空間可以使任意的,通常習慣使用URI地址作爲名稱空間.
elementFormDefault:qualified/unqualified
-->
<schema
xmlns="http://www.w3.org/2001/XMLSchema"
targetNamespace="http://www.mytest.com"
elementFormDefault="qualified">
<!-- 使用element定義元素 -->
<!-- 複雜元素 -->
<element name="books">
<!-- 複雜元素 -->
<complexType>
<sequence maxOccurs="unbounded" minOccurs="1">
<element name="book">
<!-- 複雜元素 -->
<complexType>
<!-- 子元素出現是有順序的 -->
<sequence>
<!-- 簡單元素 -->
<element name="name" type="string"></element>
<element name="author" type="string"></element>
<element name="price" type="double"></element>
</sequence>
</complexType>
</element>
</sequence>
</complexType>
</element>
</schema>
- Schema使用了一套W3C預先定義好的一套標籤進行定義的.而且Schema使用的XML的規範編寫的.支持名稱空間的.Schema的文件的擴展名爲xsd.
名稱空間類似於Java中包.Java中通過包區分類是否是同一個的.Schema通過名稱空間區分定義的標籤或者屬性是否是同一個. ↩