Qt程序設計

1.與STL對應Qt庫有本身的容器類mysql

QVector<T>、QList<T>、QLinkedList<T>、QStack<T>、QQueue<T>、 QMap<K,T>、QHash<K,T>等,Qt庫的容器的基本操做與STL庫基本相同,可是具體實現不一樣。
    對於容器元素的訪問支持3種方式linux

(1)經過下標訪問算法

(2)經過迭代器訪問sql

(3)經過成員函數訪問(好比value(idx)帶越界檢測的訪問,at(idx)不帶越界檢查的訪問)
    與STL庫不一樣的是,Qt庫的許多類都採用了隱含共享技術(也稱寫時複製),是C++中普遍使用的用來提升資源利用率和下降對象拷貝頻率的優化技術,但對使用者來講是不可見的。寫時複製具體過程爲:當類之間發生深度拷貝時,不會當即拷貝,而會共享內存,2個類經過引用計數指向同一內存地址,當某個類要修改更新內存的值此時才發生深度複製產生2塊內存(之前的內存引用計數減1)
2.迭代器(只讀迭代器和讀寫迭代器)數據庫


    Qt同時支持Java風格和STL風格的迭代器。
    Java風格迭代器強調"間"的概念,迭代器自身並不指向容器中的元素,而是表明元素與元素之間的位置,使用if(iter.hasNext())來判斷是否迭代到尾部
Java迭代器的實現獨立於容器,而STL迭代器的實現保護在容器類的實現中。
QVector<int>qvec_int;
QVectorIterator<int> iter(qvec_int); //只讀迭代器
while(itr.hasNext())   //itr.hasPrevious()
 {print_IternValue(iter.next())}; //print_ItemValue(itr.peekPrevious());編程


QMutableVectorIterator<T> 讀寫迭代器
QVector<int>qvec_int;
QMutableVectorIterator<int>iter(qvec_int);
while(i.hasNext())
{int val = iter.next();
if(val< 0) {iter.setValue(qAbs(val));}
else if( val = 0) {iter.remove();}
}設計模式

STL庫中的迭代器在各個容器類中實現,對容器操做靈活。
QVector<int> qvec_int;
QVector<int>::const_iterator itr = qvec_int.begin();//只讀迭代器
QVectoκin t>: :const_iterator end = qvec_int.end();
for(;itr!= end;++itr)
{print_ IternValue(*itr);}安全

QVector<int> qvec_int;
QVector<int>::iterator itr = qvec_int.begin() ;//選擇容器的讀寫迭代器;
QVectoκint>:: iterator end= qvec_int.end();
for(;itr != end;)
if((* itr) < O){(*itr) = qAbs((*itr));++itr;}
else if(O = (*itr)){itr = qvec int.erase(itr);}  //刪除元素
}服務器

3.STL庫中的針對迭代器的通用算法
#include <QtAlgorithms>
    (1)void qFill( Forwardlterator begin, Fonvardlterator end, const T & value)
算法可以自動地劇一個特定值( value )來對[begin,end]範回內的元索進行賦值。
    (2)Outputiterator qCopy( InputIteror beginl, Inputiterator end1, Outputlterator begin2)
算法將[beginl ,end1]內的元素按照順序複製到[begin2,...]範圍內。
    (3)void qSort( RandomAccessiterator be自1, Randon1Accesslterator end)
void qSort( RandomAccesslterator begin, RandomAccessiterator end, LessThan lessThan)
算法將[beginl,end1]範圍內的序列按升序排序。第一個聲明函數使用operator<(),第二個聲明函數使用提供的比較器對象來決定順序。
    (4)inputlterator qFind( lnputlterator begin, Inputlterator end, const T & value)
線性收索算法在[begin,end]範圍內的元素序列中查找valt1e 。返問一個迭代器對象,指向在範圍[begin,end]內value第l次出現的位置。若是value不在範圍內,qFind()返回end。
    (5)RandomAccesslterator qBinaryFind(RandomAccessiterator begin, RandomAccesslterator end,const T &value)
二分收索,同上
5.其餘容器類
QLinkedList<T> 單鏈表實現
Map:enumMap.insert(pair<int, Cstring>(1, 「One」)); enumMap.insert(map<int, Cstring>::value_type (1, 「One」));
6.Qt提供了QIODevice類進行外設到內存的數據輸入輸出,如下類都繼承於該類。網絡

QFile提供對文件的打開等操做,對文件的讀寫不進行任何字符的轉換
QBuffer從QByteArray中讀取數據。
QTemporaryFile 在本地文件系統中建立並讀寫臨時文件
QFile 在本地文件系統或者嵌入式資源中讀寫文件
QProcess 運行外部程序ft處理進程間的邊信
QTcpSockei 利用TCP 協議在網絡設備上傳輸數據
QUdpSocket 利用UDP 協議在網絡設備上傳輸數據
QSslSocket 利用SSL/TSL 協議在網絡設備上傳輸加密數掘


QDataStream和QTextStream類能夠是以上全部類的上層,能夠提供二進制流和文本格式的讀寫操做。
QDataStream提供按二進制形式操做文件,格式化讀寫或者串行操做(讀寫整型、浮點型數據等)
QTextStream提供按文本格式操做文件,格式化讀寫

7.QDir提供了對目錄的遍歷等方法
QFileInfo保存某個文件的具體屬性
QFileSystemWatcher 類來監視指定目錄或者文件的變化,addPath()、addPaths()函數用來監視指定的一個或者多個文件或者目錄。
QXML提供了對XML文件的處理方法(有2中處理方式DOM文檔對象模型和SAX簡單應用程序接口處理方式,後者適合於處理大型文檔)
常見操做XML類有QXmlStrea1nReader、QDornDocument、QxmlDefaultHandler、QXrnl Si1npleReader等
QXmlSimpleReader是SAX模型實現的解析器
8.多線程
同步方法有:互斥量、信號量、讀寫鎖、條件變量
Qt 包含下面一些線程相關的類:
(1) QThread 提供了開始一個新線程的方法;
(2) QThreadStorage 提供逐線程數據存儲:
(3) QMutex 提供相互排斥的鎖,或互斥量:
(4) QMutexLocker 是一個互斥鎖的,它能夠自動對QMutex 加鎖與解:
(5) QReadWriterLock 提供了一個能夠同時讀操做的鎖;
(6) QReadLocker 與QWriteLocker 是便利類,它自動對QReadWriteLock加鎖與解鎖:
(7) QSemaphore 提供了一個整型信號量,是互斥量的泛化;
(8) QWaitCondition 條件變量提供了一種方法,使得線程能夠在被其餘線和喚醒它以前一直休眠。

線程的實現須要繼承Qthread類並實現run()方法
#include <Qthread>
class MyThread : public Qthread{
Q_OBJECT
protected:
void run();
}
void MyThread::run(){
printf(」Thread Begin,sleep two seconds !\n");
sleep(2);
printf(」Thread End,exit!\n」);
}
int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);
MyThread newThread;
newThread.start();
return a.exec();
}

QWaitCondition 類容許線程在某些狀況發生時喚醒其餘的線程。當一個或多個線程阻塞等待時,可用wakeOne()隨機喚醒一個線程, wakeAll()喚醒全部線程。其設計也須要一個mutex量來互斥的訪問條件。與linux中使用條件變量的代碼結構基本相同。
線程池:
Qt4 提供線程池QThreadPool管理和回收QThread 建立的線和對象, 從而減小因爲線程建立和銷燬所帶來的資源開銷。每個Qt 的應用程序都有一個全局的QThreadPool對象,能夠經過函數globalInstance()調用該線程池全局對象。事實上,這裏是使用QThreadPool類來運行一個QRunnabl e 對象,它維護了一個線程
池。經過調用QThreadPool::start(runnable),把一個QRunnable 放入QThreadPool 的運行隊列中;只要錢程是可見的,QRunable 將會被拾起而且在那個線程裏運行。儘管全部的Qt 應用程序都有一個全局的線程池,且它是經過調用QThreadPool::globalInstance()可見的, 但一般是顯式地創邊井管理一個私有的QThreadPool 實例。

#include <QtCore/QCoreApplication>
#include <QthreadPool>
class HelloWorldTask: public QRunnable
{void run()
   {printf(」This is thread HelloWroldTask.\n」);}
}
class CThread : public QRunnable
{ void run()
    {printf(」This is thread CThread.\n」);}
}

int main(int ar民char *argv0)
{QCoreApplication a(argc, argv);
HelloWorldTask *hello = new HelloWorldTask();
CThread* thread = new CThread();
QthreadPool::globalInstance()->start(hello);
QthreadPool::globalInstance()->start(thread);
return a.exec();
}
9.數據庫
QT庫提供瞭如下數據庫驅動
QDB2          LBM 082
QIBASE        Borland I nterBase 驅動
QMYSQL        MySQL 驅動
QOCI          Orcale Call lnterface 驅動
QODBC         OBDC 驅動(包括Micofosfot SQL Server)
QPSQL         PostgreSQL 驅動
QSQLITE       SQLite version 3 或更高版本
QSQLITE2      SQLite version 2
QtDS          Sybase Adaptive Server
Qt 的數據庫棋快主要經過QSqlDatabase 類對象實現對數據庫的綁定和鏈接,而後經過QSqlQuery
類對象執行相關的SQL語句對數據庫進行操做。
mysql數據庫的鏈接:
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL"); //指定使用的驅動
db.setHostNan1e("qpk"); //數據庫所在的遠程主機名或域名
db.setDatabaseName("bookmis.db"); //查詢的數據庫名
db.setUserName("qpk");   //登陸數據庫的用戶名
db.setPassword("cugbupt");//密碼
bool ok = db.open();
QSqlQuery類對數據庫的操做方式

QSqlQuery query;
bool value;
query.exec("SELECT * FROM book");//在QSqlQuery 類中當執行execO後會把指針放在記錄集中第一個記錄之上,因此須要調用QSqlQuery::next()來獲取第一個數據.
while(query.next()){QString name = query.value(O).toSt1ing();}//QSq!Query: :value()函數獲得當前記錄區域中的數據,value()默認返回的是一個QVariant類型,可使用QVariant::toString 或QVariant::toInt().
value=query.exec("delete from book where ID=’」+id+’」」);
value=query .exec("update book name set name='+nan1e+’where ID='+ id+ ’");

10.QT網絡編程
獲取主機信息:包括主機名、IP地址等。在Qt中,QHostlnfo類用來獲取主機網絡配置的相關信息。該類提供了兩個經常使用的靜態函數來獲取機信息, 一個是使用lookupHost( const QString & na1ne, QObject*receiver, const char *1ne1nber)函數異步查詢主機信息,而且在主機查詢完畢後發出一個信號。
另外一個足使劇QHostlrlfo 企omName( const QString & name)的數阻塞查詢主機信息, 而且返回一個QHostlnfo 對象。
QHostlnfo::lookuphost("wwvv.yyy.com",this,SLOT(handlerResults(QHostInfo)));
QHostlnfo::lookuphost("192.168.1.102",this,SLOT(handlerResults(QHostInfo)));
QHostlnfo host= QHostlnfo::FromName("www .yyy.com ");
QTcpSocket、QTcpServer 類用來實現TCP 客戶端和服務器端的應用程序.
QUdpSocket 類能夠用來發送束l接收UDP 數據報。
QHttp、QNetworkAccessManager 等類來構建HTTP客戶端.
QFtp 類來實現異步工做的FTP 協議的客戶端,同時也提供了多種操做來執行常見的FTP操做.

11.QT的信號與槽機制
        信號與槽是Qt 的核心機制之一,應用於對象之間的通訊,使用該機制能夠在對象之間彼此並不瞭解的狀況下將它們的行爲聯繫起來。信號和槽能攜帶任意數量和任意類型的參數,它們是類型徹底安全的,不會像回調函數那樣產生core dumps。
         全部從QObject 或其子類(例如QWidget)派生的類都可以包含信號和槽。
        當對象改變其狀態時, 信號就由該對象發射(emit)出去, 這就是對象所要作的所有事情,它不知道另外一端是誰在接收這個信號。
糟用於接收信號, 但它們是普通的對象成員函數。一個柄並不知道是否有任何信號與本身相鏈接。並且,對象並不瞭解具體的通訊機制。
        一般Qt 的控件都提供了經常使用的信號與槽,在開發過程當中無需定義能夠直接使用這些內容的信號與槽。
包含信號或槽的類須要使用Q_OBJECT宏放在類的開始位置,當MOC元對象預編譯器發現該宏時就會將該類文件生成一個XXX.MOC.CPP的文件,用於編譯。
Q_OBJECT宏能夠代表該類繼承自QObject類,能夠調用connect,disconnect等方法。
信號:
若是存在多個梢與某個信號相關聯,那麼,當這個信號被髮射時爭, 這些槽將會一個接一個地執行,但足它們執行的順序將會是隨機的、不肯定的,不能人爲地指定哪一個先執行、哪一個後執行。
信號的聲明是在頭文件中進行的, 使用了signals 關鍵:例如, 下面在類中定義了三個信號:
signals:              //qt的關鍵字
void mySignal();
void mySignal(int x);
void mySignal(int x,int y);
信號相似於函數定義可是沒有函數體,返回老是爲void,而且能夠重名定義。
槽:
槽是普通的C++成員函數,能夠被正常調用,他們惟一的特殊性就是不少信號能夠與其相關聯。當與其關聯的信號被髮射時,這個槽就會被調用。槽能夠有參數,但槽的參數不能有缺省值。
既然梢是普通的成員函數, 所以與其餘的函數同樣, 它們也有存取權限。槽的存取權限
決定了誰可以與其相關聯。同普通的C++成員函數同樣,槽函數也分爲三種類型,即public slots、protected slots 和private slots。
public slots : 在這個區內聲明的槽意味着任何對象均可將信號與之相鏈接。
protected slots : 在這個區內聲明的槽意味着當前類及其子類能夠將信號與之相鏈接。
private slots : 在這個區內聲明的槽意味着只有類本身能夠將信號與之相鏈接。
槽也能夠聲明爲虛函數, 這也是很是有用的。
槽的聲明也是在頭文件中進行的。例如,下面聲明瞭三個槽 :
public slots:
void myslot();
void mySlot(int x);
void mySignalParam(int x,int y);
信號不須要實現,槽是須要實現的。
信號與槽的關聯:
使用connect()函數將某個對象的信號與另一個對象的槽函數相關聯,這樣發送某信號時,接收對象的槽函數就會被執行。
使用disconnect()函數斷開信號與槽之間的鏈接。(當對象銷燬時,會自動斷開鏈接)
bool QObject::connect( const QObject *sender,const char* signal,const QObject* receiver,const char* member) [static]
bool QObject::disconnect( const QObject *sender,const char* signal,const QObject* receiver,const char* member) [static]
如connect()函數聲明所示,其將發射者sender對象中的信號signal與接收者receiver對象中的member 槽函數鏈接起來。
一般狀況下無需顯示調用斷開信號與糟之間的關聯,當對象銷燬時,會自動斷開鏈接。
然而有三種狀況必須使用disconnect() 函數:
(1)斷開與某個對象相關聯的任何對象的任何信號和槽:當在某個對象中定義了多個信號,這些信號與另外若干個對象中的槽相關聯,若是咱們要切斷這
些關聯,可使用disconnect(myObject,0,0,0)或者myObject->disconnect()
(2)斷開與某個特定信號的任何關聯:disconnect(myObject,STGNAL(mySignal()),0,0)或myObject->disconnect(SIGNAL(mySignal()))
(3)斷開兩個對象之間的關聯:disconnect( myObject,0,myReceiver,0)或myObject->disconnect(myReceiver)
 在disconnect函數中0能夠用做一個通配符,分別表示任何信號、任何接收對象、接收對象中的任何槽的數。可是發射者sender不能爲0,其餘三個參數的值能夠等於0。

函數指針和模板類不能做爲信號和槽的參數
public slots:
void apply( void (*applyFunction)(QList*, void*), char*); //不合法
void MyWidget::setLocation (pair<int,int> location);//不合法
但可使用typedef來規避這種限制,如下是合法的。
typedef pair<int,int> lntPair;
typedef void (*ApplyFunction)(QList*, void*);
public slots:
void apply( Apply Function Type, char*);
void setLocation (lntPair location);

12.Qt事件
幾乎當今全部的應用程序開發框架都是以事件爲驅動的,Qt 也不例外。
在Qt的事件機制中,Qt將環境變化的信息組織成一個繼承自QEvent的對象並經過調用QObject::event()將
之發送到繼承白QObject的目標對象事件處理隊列中,交由目標對象去響應。
Qt 的事件處理的大體流程以下:
(1) Qt 的幸事件循環exec()感知某個事件的產生。
(2) Qt 建立此事件所對應的事件對象(派生自QEvent),經過QObj ect::event()進行派送。
(3)事件的目的對象根據事件類型,將其分配給對應的事件處理函數。
(4)在事件處理函數中根據事件的須要對事件進行處理(如發射特定信號emit)。

通常狀況下, 事件來臼底層窗口系統, Qt 的主事件循環( QApplication: :exec() ) 從事件
隊列取得本地窗口系統的事件,並將它們轉變成QEvent , 而後將轉換好的事件發送給目標
QObject , 可是也有可能經過QApplication 類的QApplication::sendEvent() 和
QApplication: :postEvent()來手動發送事件。
根據事件產生的方式, Qt 事件機制將事件分爲如下三類:

( 1 )原生事件( Spontaneous ) , 由窗口系統產生, 它們被放到系統隊列中, 經過事件循
環逐個處理。
(2 )轉發事件( Posted ),由Qt 或是應用程序產生,它們被Qt 組成隊列,再經過事件循
環處理。
(3 )發送事件( Sent ),由Qt 或是應用程序產生, 但它們被直接發送到目標對象。
根據事件的處理方式,上述三類事件又能夠分爲異步處理事件( Spontaneous 事件、
Posted 事件)和同步處理事件( Sent 事件)。
在Qt 的主事件循環I j 1 處理的是異步事件。首先, 事件循環處理全部的Posted 事件,
直到隊列空。然所再處理全部的Spontaneous 事件, 最後它處理全部的由於處理
Spontaneous 事件而產生的Posted 事件。Send 事件並不在事件循環內處理, 它們都直接被髮送到目標對象。
常見的一些事件:QKeyEvent鍵盤事件、QMouseEvent鼠標事件、QDragMoveEve拖放事件、socket事件等
Qt 爲不一樣的事件提供了不一樣的處理函數,用戶能夠經過從新實現相應的事件處理函數來響應井處理對應的事件。
( 1 ) void mousePressEvent(QMouseEvent *) : 當鼠標在組件區域內被按下時, 會調用此
事件處理函數。
( 2) void mouseMoveEvent(QMouseEvent *): 當鼠標在組件區域內移動時, 會調用此事
件處理函數。
Qt 容許用戶根據自身的須要自定義事件。Qt 中的自定義事件很簡單, 同創
建自定義窗口組件很類似, 都是要繼承一個類(QEvent)進行擴展。
對於自定義事件的響應, 能夠經過從新實現目標對象的customEvent(QEvent * event)
函數來對自定義事件地行處理, customEvent 是QObject 提供的用以處理用戶自定義事件的
方法,參數event 就是由Qt 事件系統所接收到的事件枚舉值大於等於QEvent::User 的事件對
象指針.
void CustomEventReceiver::customEveot( QEvent *event )
{switch(event->type()) {
case CustomEventType l:...
break;
case CustomEventType2:...
}}
12.MVC模型/視圖(Model-View-Controller設計模式)
MVC把交互系統的組成分解成模型(Model)、視圖(View),控制(Controller)三種部件。
Model是應用程序對象,View是它的屏幕表示,Controller定義了用戶界面如何對用戶輸入進行響應.
13.Qt經常使用控件
每一個控件都有本身的信號和槽,經過信號與槽的鏈接能夠實現用戶交互。
QButton、QPushButton、QButtonGroup、QRadioButton、QLineEdit、QTextEdit、QTime、QTimeEdit、QDate、QDateEdit、QCalendarWidget、QCombox、QLCDNumber、QProgress Bar、QSpinBox、QDoubleSpinBox、QSlider、QTreeWidget、QTabWidget等
14.佈局管理
Qt提供了3種佈局管理方法
(1)絕對位置法:該佈局方法經過調用基類QWidget提供的setGeometry()函數來設置子窗口部件在父窗口中顯示的國定大小和位置。
(2)人工位置法:該佈局方法經過調用基類QWidget提供的setGeometry()函數來設置子窗口部件在父窗口中顯示的國定大小和位置。但與絕對位置法不一樣的是, 該方法經過重載voidQWidget::resizeEvent( QResizeEvent *)函數使得子窗口部件大小和父窗口部件大小成比例。
(3)佈局管理器方式:該佈局方法爲不一樣類型的窗口部件提供一系列合適的默認值, 而且會根據窗口的大小策略和最大、最小尺寸,自動調整佈局來響應樣式、窗口人小的變化。
Qt 佈局管理器負責在父窗口部件區域內存放子窗口部件。
QLayout 類是佈局管理器的基類,它的派生類主要有QBoxLayout、QFormLayout、QGridLayout 和QStackedLayou t, 而QBoxLayout 又有兩類派生類QHBoxLayout 和QVBoxLayout。
15.對話框QDialog
Qt實現了一些標準對話框:QAbstractPrintDialog、QColorDialog、QErrorMessage、QFileDialog、QFontDialog、QlnputDialog、QPageSetupDialog、QMessageBox、QProgressDialog、QWizard等
16.QMainWindow主窗口應用程序
主窗口和對話框的區別:主窗口一般包括菜單欄、工具欄、工做區和狀態欄,主窗口中也能夠有控件;而對話框能夠理解爲添加控件的一個容器。
一個應用程序能夠有多個主窗口和多個對話框。一個應用程序的主窗口必須從QMainWindow繼承,而對話框必須從QDialog繼承。
17.XML文件解析方法
Qt提供了3種XML文件解析方法,其中DOM和SAX也被其餘語言所經常使用。
QXmlStreamReader和SAX模型將處理XML中的10種記號:
startdocument xml處理開始時將遇到此記號或產生此事件
enddocument xml處理結束時將遇到此記號或產生此事件
startelement   好比<iter>
sendelement    好比</iter>
characters     <iter>與</iter>之間的內容
comment        好比<!--fix--> 註釋
DTD            好比<!DOCTYPE>
entityreference 好比&trade;  引用實體
processinginstruction  好比<?alert?>  處理指示標記,通常在第一行
invalid        好比>&<!   無效或錯誤標記
(1)QXmlStreamReader(順序模型) 最快最簡單,適於大型文檔(不會將整個文檔讀入內存),適於查找性解析XML,只使用readNext()來查找下一個記號。
QXmlStreamReader提供了迭代的方法讀寫一個標記.readNext(),並提供了對.readNext()讀回的標記的判斷(是10種標記中的哪種)。具體的解析過程須要用戶根據XML文檔自行實現。
(2)DOM(對象模型)  DOM是用與平臺和語言無關的方式表示XML文檔的官方W3C標準。DOM是以層次結構組織的節點或信息片段的集合(以樹形結構解析)。便於對XML進行解析和修改。
對應 XML 語法中的每一個概念定義相應的類:元素、屬性、實體、文檔。解析器讀入 XML 文檔的時候,創建 XML 語法和類之間的一對一映射。好比,每遇到一個標記,就實例化一個元素類。
每個子樹都是一個QDomElement元素
(3)SAX(事件模型)  SAX是一種事件API,處理的優勢很是相似於流媒體的優勢。分析可以當即開始,而不是等待全部的數據被處理。並且,因爲應用程序只是在讀取數據時檢查數據,所以不須要將數據存儲在內存中。這對於大型文檔來講是個巨大的優勢。
SAX解析器採用了基於事件的模型,它在解析XML文檔的時候能夠觸發一系列的事件,當發現給定的tag的時候,它能夠激活一個回調方法,告訴該方法制定的標籤已經找到。
通常實現方法爲繼承QXmlDefaultHandler類,並實現遇到標記時須要調用的虛函數,通常須要實現startelement(),endelement()

Qt也提供了3種寫入XML的方法:
(1)使用QXmlStreamWriter。對於建立xml文檔比較容易,對已有xml進行修改比較困難。
(2)使用DOM模型。對於已有的xml進行修改比較容易
(3)手動寫入。有用戶自行建立文件,按通常文件的方式寫入字符串

18.XML語法簡介1).xml用途:xml僅僅是純文本,用於應用程序之間傳輸和存儲數據,不一樣於HTML用於顯示數據2).一個 XML 文檔實例<?xml version="1.0" encoding="ISO-8859-1"?><note><to>George</to><from date="08/08/2008">John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>第一行是 XML 聲明,處理指示根元素有4個子元素(to, from, heading 以及 body)XML 文檔必須包含根元素,該元素是全部其餘元素的父元素,XML 文檔中的元素造成了一棵文檔樹。全部 XML 元素都須有關閉標籤,HTML則能夠沒有。而且XML開始標籤和關閉標籤必須正確嵌套。<from date="08/08/2008">John</from>  這個總體是一個以<to>標籤引導的元素,元素包括元素名、屬性(屬性值必須加引號)和內容文本,還能夠包含子元素。3).實體引用在內容文本等中須要使用XML的缺省字符時,可使用實體引用。<message>if salary &lt; 1000 then</message>   表明的字符串是「if salary < 1000 then」在 XML 中,有 5 個預約義的實體引用:&lt;     < 小於 &gt;     > 大於 &amp;    & 和號 &apos;   ' 單引號 &quot;   " 引號 4).XML 中的註釋<!-- This is a comment --> 5).避免 XML 屬性?因使用屬性而引發的一些問題:?屬性沒法包含多重的值(元素能夠)?屬性沒法描述樹結構(元素能夠)?屬性不易擴展(爲將來的變化)?屬性難以閱讀和維護請儘可能使用元素來描述數據。而僅僅使用屬性來提供與數據無關的信息。6). XML 文檔類型定義文檔結構<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE note SYSTEM "Note.dtd"><note><to>George</to><from>John</from><heading>Reminder</heading><body>Don't forget the meeting!</body></note>  在上例中,DOCTYPE 聲明是對外部 DTD 文件的引用。下面的段落展現了這個文件的內容。DTD 的做用是定義 XML 文檔的結構。它使用一系列合法的元素來定義文檔結構:<!DOCTYPE note [  <!ELEMENT note (to,from,heading,body)>  <!ELEMENT to      (#PCDATA)>  <!ELEMENT from    (#PCDATA)>  <!ELEMENT heading (#PCDATA)>  <!ELEMENT body    (#PCDATA)>]> 7).xml語法在線驗證器能夠提供對xml語法的驗證

相關文章
相關標籤/搜索