可擴(kuò)展的標(biāo)記語(yǔ)言
描述數(shù)據(jù)、存儲(chǔ)數(shù)據(jù)、傳輸(交換)數(shù)據(jù)。
目的不一樣
XML 被設(shè)計(jì)用來(lái)描述數(shù)據(jù),其焦點(diǎn)是數(shù)據(jù)的內(nèi)容。
HTML 被設(shè)計(jì)用來(lái)展示數(shù)據(jù),其焦點(diǎn)是數(shù)據(jù)的外觀。
HTML可以不關(guān)閉標(biāo)簽(即標(biāo)簽可以不成對(duì)出現(xiàn)),但XML必須關(guān)閉標(biāo)簽(即標(biāo)簽必須成對(duì)出現(xiàn))。
HTML中的標(biāo)簽標(biāo)識(shí)文本如何展示,而XML中的標(biāo)簽標(biāo)識(shí)文本是什么含義(什么類型的文本)。
u 文檔(document)
u 元素(element)
u 屬性(attribute)
u 文本(PCDATA--parsed character data)
u 注釋(comment)
u DOCTYPE :主要驗(yàn)證文檔內(nèi)容的正確性
u 實(shí)體(ENTITIES)
u CDATA(character data)
1、聲明:<?xmlversion="1.0" encoding="UTF-8"?>
2、根節(jié)點(diǎn):必須有一個(gè)根節(jié)點(diǎn)
3、標(biāo)簽:標(biāo)簽必須有結(jié)束且區(qū)分大小寫,標(biāo)簽必須順序嵌套
4、屬性:必須引號(hào)引起值
5、空格會(huì)被保留,HTML空格最多保留一個(gè)
6、命名規(guī)則:命名必須見(jiàn)名知意
a)名字可包含字母、數(shù)字以及其他的字符
b)名字不能以數(shù)字或者標(biāo)點(diǎn)符號(hào)開(kāi)始
c)名字不能以字符“xml”(或者XML、Xml)開(kāi)始
7、名字不能包含空格
8、 不應(yīng)在 XML 元素名稱中使用 ":" ,這是由于它用于命名空間(namespaces)的保留字。
9、標(biāo)簽優(yōu)先于屬性。
10、XML 命名空間可提供避免元素命名沖突的方法。
11、CDATA:字符數(shù)據(jù),<![CDATA[字符數(shù)據(jù)]]> ,字符數(shù)據(jù)不進(jìn)行轉(zhuǎn)義
12、實(shí)體:&實(shí)體;
DTD(DocType Definition 文檔類型定義)的作用是定義 XML 文檔的合法構(gòu)建模塊。
它使用一系列的合法元素來(lái)定義文檔結(jié)構(gòu)。用于約定XML格式。
例如:
<?xml version="1.0"encoding="UTF-8" standalone="yes"?>
<!DOCTYPE 書架 [
<!ELEMENT 書架 (書+)>
<!ELEMENT 書 (書名,作者,售價(jià))>
<!ELEMENT 書名 (#PCDATA)>
<!ELEMENT 作者 (#PCDATA)>
<!ELEMENT 售價(jià) (#PCDATA)>
]>
<書架>
<書>
<書名>Java就業(yè)培訓(xùn)教程</書名>
<作者>張孝祥</作者>
<售價(jià)>39.00元</售價(jià)>
</書>
...
</書架>
<!DOCTYPE 根元素 SYSTEM "dtd文件位置">
例如:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE 書架 SYSTEM "book.dtd">
<書架>
<書>
<書名>java編程思想</書名>
<作者>Brnee</作者>
<售價(jià)>80</售價(jià)>
</書>
</書架>
<!DOCTYPE 根元素 PUBLIC "命名空間""dtd文件位置">
首先根據(jù)“命名空間”去問(wèn)環(huán)境要相應(yīng)的dtd文件,如果有,直接提供,如果沒(méi)有再根據(jù)dtd文件位置找。
例如:<!DOCTYPE web-app PUBLIC
"-//SunMicrosystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">
<?xml version="1.0"?>
<!DOCTYPE note [
<!ELEMENT note (to,from,heading,body)>
<!ELEMENT to (#PCDATA)>
<!ELEMENT from (#PCDATA)>
<!ELEMENT heading (#PCDATA)>
<!ELEMENT body (#PCDATA)>
]>
<note>
<to>Tove</to>
<from>Jani</from>
<heading>Reminder</heading>
<body>Don't forget me this weekend</body>
</note>
點(diǎn)擊打開(kāi)鏈接
XML Schema 是基于 XML 的 DTD 替代者。XML Schema 描述 XML 文檔的結(jié)構(gòu)。XML Schema 語(yǔ)言也稱作 XML Schema 定義(XML Schema Definition,XSD)。
DTD不是通過(guò)XML語(yǔ)法定義文檔結(jié)構(gòu), 不能定義數(shù)據(jù)類型和限制Schema通過(guò)XML語(yǔ)法定義文檔結(jié)構(gòu),可以定義數(shù)據(jù)類型和限制
約定XML格式
XML Schema 是 DTD 的繼任者
<users xmlns="命名空間"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="命名空間 Schema位置">
如何找Schema,和DTD一樣,首先根據(jù)命名空間問(wèn)環(huán)境要,找不到再根據(jù)Schema位置找。
<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
<!--xs="http://www.w3.org/2001/XMLSchema" 聲名了w3c的名稱空間,方便下面調(diào)用 -->
targetNamespace="http://www.zhong.cn"
elementFormDefault="qualified">
<!--
schema 是根元素
xmlns:xs="http://www.w3.org/2001/XMLSchema"
指明了在schema中使用的元素和數(shù)據(jù)種類來(lái)自http://www.w3.org/2001/XMLSchema名稱空間(namespace)。
它也指定了來(lái)自"http://www.w3.org/2001/XMLSchema"名稱空間(namespace)的元素和數(shù)據(jù)種類必須帶前綴“xs:”
targetNamespace="http://www.zhong.cn"(將全部元素綁定給這個(gè)名稱空間)
暗示了由這份schema(shiporder, orderperson, shipto, ....)定義的元素來(lái)自"http://www.zhong.com"名稱空間
xmlns="http://www.w3schools.com"
指明了默認(rèn)名稱空間(namespace)是http://www.w3schools.com.
elementFormDefault="qualified" (“unqualified”)將根節(jié)點(diǎn)綁定到名稱空間
將所有元素綁定到名稱空間
-->
<!--xs:element 指的是element這個(gè)元素來(lái)自于xs名稱空間 -->
<xs:element name="shiporder"> <!-- 定義一個(gè)元素 shiporder -->
<xs:complexType> <!-- 類型是:復(fù)合類型(里面包含元素或者屬性) -->
<xs:sequence> <!-- 元素要有順序 -->
<xs:element name="orderperson" type="xs:string"/> <!-- 定義一個(gè)元素 orderperson 類型為:字符串 -->
<xs:element name="shipto" minOccurs="1" maxOccurs="1"> <!-- 定義一個(gè)元素 shipto 最少出現(xiàn)1次,最多出現(xiàn)1次 -->
<xs:complexType> <!-- shipto元素也是復(fù)合類型 -->
<xs:sequence> <!-- 元素要有順序 -->
<xs:element name="name" type="xs:string"/> <!-- 在shipto元素中定義一個(gè)元素 name 類型為:字符串 -->
<xs:element name="address" type="xs:string"/>
<xs:element name="city" type="xs:string"/>
<xs:element name="country" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
<xs:element name="item" maxOccurs="unbounded"> <!-- 在shiporder元素中定義一個(gè)元素 item 出現(xiàn)次數(shù)可以無(wú)限次 -->
<xs:complexType>
<xs:sequence>
<xs:element name="title" type="xs:string"/>
<xs:element name="note" type="xs:string" minOccurs="0"/>
<xs:element name="quantity" type="xs:positiveInteger"/>
<xs:element name="price" type="xs:decimal"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
<xs:attribute name="orderid" type="xs:string" use="required"/>
</xs:complexType>
</xs:element>
</xs:schema>
xml文件:
<?xml version="1.0" encoding="utf-8" ?>
<Result>
<VALUE>
<NO DATE="2005">A1</NO>
<ADDR>GZ</ADDR>
</VALUE>
<VALUE>
<NO DATE="2004">A2</NO>
<ADDR>XG</ADDR>
</VALUE>
</Result>
1)DOM
import java.io.*;
import java.util.*;
import org.w3c.dom.*;
import javax.xml.parsers.*;
public class MyXMLReader{
public static void main(String arge[]){
long lasting =System.currentTimeMillis();
try{
File f=new File("data_10k.xml");
DocumentBuilderFactory factory=DocumentBuilderFactory.newInstance();
DocumentBuilder builder=factory.newDocumentBuilder();
Document doc = builder.parse(f);
NodeList nl = doc.getElementsByTagName("VALUE");
for (int i=0;i<nl.getLength();i++){
System.out.print("車牌號(hào)碼:" + doc.getElementsByTagName("NO").item(i).getFirstChild().getNodeValue());
System.out.println("車主地址:" + doc.getElementsByTagName("ADDR").item(i).getFirstChild().getNodeValue());
}
}catch(Exception e){
e.printStackTrace();
}
2)SAX
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import javax.xml.parsers.*;
public class MyXMLReader extends DefaultHandler {
java.util.Stack tags = new java.util.Stack();
public MyXMLReader() {
super();
}
public static void main(String args[]) {
long lasting = System.currentTimeMillis();
try {
SAXParserFactory sf = SAXParserFactory.newInstance();
SAXParser sp = sf.newSAXParser();
MyXMLReader reader = new MyXMLReader();
sp.parse(new InputSource("data_10k.xml"), reader);
} catch (Exception e) {
e.printStackTrace();
}
System.out.println("運(yùn)行時(shí)間:" + (System.currentTimeMillis() - lasting) + "毫秒");}
public void characters(char ch[], int start, int length) throws SAXException {
String tag = (String) tags.peek();
if (tag.equals("NO")) {
System.out.print("車牌號(hào)碼:" + new String(ch, start, length));
}
if (tag.equals("ADDR")) {
System.out.println("地址:" + new String(ch, start, length));
}
}
public void startElement(String uri,String localName,String qName,Attributes attrs) {
tags.push(qName);}
}
3) JDOM
import java.io.*;
import java.util.*;
import org.jdom.*;
import org.jdom.input.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
SAXBuilder builder = new SAXBuilder();
Document doc = builder.build(new File("data_10k.xml"));
Element foo = doc.getRootElement();
List allChildren = foo.getChildren();
for(int i=0;i<allChildren.size();i++) {
System.out.print("車牌號(hào)碼:" + ((Element)allChildren.get(i)).getChild("NO").getText());
System.out.println("車主地址:" + ((Element)allChildren.get(i)).getChild("ADDR").getText());
}
} catch (Exception e) {
e.printStackTrace();
}
}
4)DOM4J
import java.io.*;
import java.util.*;
import org.dom4j.*;
import org.dom4j.io.*;
public class MyXMLReader {
public static void main(String arge[]) {
long lasting = System.currentTimeMillis();
try {
File f = new File("data_10k.xml");
SAXReader reader = new SAXReader();
Document doc = reader.read(f);
Element root = doc.getRootElement();
Element foo;
for (Iterator i = root.elementIterator("VALUE"); i.hasNext();) {
foo = (Element) i.next();
System.out.print("車牌號(hào)碼:" + foo.elementText("NO"));
System.out.println("車主地址:" + foo.elementText("ADDR"));
}
} catch (Exception e) {
e.printStackTrace();
}
}
如對(duì)本文有疑問(wèn),請(qǐng)?zhí)峤坏浇涣髡搲?,廣大熱心網(wǎng)友會(huì)為你解答?。?點(diǎn)擊進(jìn)入論壇