標籤:

XML筆記

XML筆記 標籤: Qt XML 分類: 技術筆記-Qt 2009-04-10 18:11摘抄XML元素 XML元素是可擴展的.也就意味著XML文檔內容可以隨時通過擴展來儲存更多的數據信息.e.g:<?XML version="1.0" encoding="GB2312"?><龍蝦大餐><價格>槍斃你的工資</價格><口感>一斑斑</口感><副作用>鬧肚子</副作用></龍蝦大餐>這時,如果我們要通過我們的應用程序或其他的東西來輸出這段數據的部分內容,如<價格>,<口感>,<副作用>.將會現實如下結果(輸出結果因你的輸出形式確定,XML數據內容本身不做改變)XML屬性值eg.<我的故事 價值="無價之寶">.........</我的故事>其中價值="無價之寶" 這段代碼就是根元素"我的故事"的屬性值.那麼,屬性值可以做什麼呢?XML中的屬性值可以被用來為元素添加額外的說明信息.其實我們很早以前就已經接觸過屬性值,而且頻率非常的高,那就是出現在HTML中的屬性值.e.g:<font size="7" color="red">屬性值在HTML中的運用</font>~~~~~~~~ ~~~~~~~~~~~<a href="http://go.go.go">到處都是屬性值的運用</a>e.g:屬性值運用<?XML version="1.0" encoding="GB2312"?><我的介紹 姓名="JSPer" 性別="unknow" 職業="無" 聯繫方式="JSPer@371.net"></我的介紹>不使用屬性值<?XML version="1.0" encoding="GB2312"?><我的介紹><姓名>JSPer</姓名><性別>unknow</性別><職業>無</職業><聯繫方式>JSPer@371.net</聯繫方式></我的介紹>顯而易見,頻繁的使用屬性值很難與維護和更新,而且,使用屬性值還有一系列的弱點---1,屬性值不可以包含多重數值(元素可以);2,屬性值難於擴展(考慮到長遠打算);3,屬性值不能夠用於描述結構內容(子元素則可以);4,屬性值很難通過DTD來進行一個測試(關於DTD的介紹,請期待後續教程)XML的名字空間由於XML對互操作性的支持,每個人都可以創建屬於自己的XML辭彙。這樣一來,如果不同的開發者用相同的元素來代表不同的實體的話,後果是不可想像的。為了防止這種潛在的衝突,W3C在XML中引入了名字空間。XML名字空間為你的XML文檔元素提供了一個上下文。它允許開發者按一定的語義來處理元素。還以漢堡包舉例說明,在某個系統中price元素可能代表的是消費者的購買價,而在另一個系統中,它可能代表了商店的進貨價。下面的例子演示了名字空間是怎樣幫我們解決這樣的問題的。<?XML version="1.0"?><hamburgers  XMLns:purchase="http://fastfood.org/franchise/prices"  XMLns:sales="http://fastfood.org/customer/prices"> <hamburger lowfat="dream on">  <name>CowBurger</name>  <description>Greasy and good.</description>  <purchase:price>0.99</price>  <sales:price>2.99</price> </hamburger></hamburgers>schema一個schema通常是一組為了描述一類給定的XML文檔而預先定好的規則。它定義了可以在指定XML文檔中出現的各個元素以及和某個元素相關的若干屬性。它同時定義了關於XML文檔的結構化信息,比如哪幾個元素是其他元素的子元素,子元素出現的順序和他們的數量。它還可以定義一個元素是否為空,能否包含文本或者屬性是否有默認值。DTDs(Document Type Definitions)和XML數據 都是怎樣描述XML文檔計劃的具體例子。 文檔類型定義(Document Type Definitions)DTD語言是為了定義SGML文檔的確認規則而專門開發的。因為XML是SGML的一個子集,所以DTDs也可以用來定義 XML的確定規則。與XMLschema不同,一個XML處理器可以在運行時用DTD來確定一個XML的合法性。DTD的語法有時可能會有一些晦澀難懂。DTDs使用不同的語法元素,諸如驚嘆號、圓括弧、星號、尖括弧等,來定義在一個XML文檔中那些元素是必備的,哪些是可選的以及可以出現的元素數量等等。DTDs同時還定義了元素之間的關係和屬性於不同元素之間的關係。下面就是前面列出的hamburger.XML的DTD(hamburger.dtd):<!ELEMENT hamburgers (hamburger)*><!ELEMENT hamburger (name, description, price)><!ATTLIST hamburger lowfat CDATA #IMPLIED><!ELEMENT name (#PCDATA)><!ELEMENT description (#PCDATA)><!ELEMENT price (#PCDATA)>這篇文檔指出,hamburgers元素可以包含多個hamburger元素。同時,每一個hamburger元素必須包含一個lowfat屬性和三個子元素,所有的類型都是#PCData(parsed character data)。遵從這篇DTD的文檔都必須加入下面一行代碼: <!DOCTYPE hamburgers SYSTEM "hamburger.dtd">使用記錄使用Qt中的SAX2,而不是DOM。將QXmlStreamReader、QXmlStreamWriter和QString型的filename封裝於FileListUtil中,然後實現對播放列表的存取功能,操作對象是一xml文件,裡面保存了播放列表。寫操作void FileListUtil::saveFileList(const QStringList &list){ QFile file(fileListName); if (!file.open(QFile::WriteOnly | QFile::Text)) { #ifdef MY_DEBUG QMessageBox::warning(0, tr("Save Meidia Player list failed!"), tr("Cannot write file %1:
%2.") .arg(fileListName) .arg(file.errorString())); #endif emit FileIOError(file.errorString()); } writer->setDevice(&file);//FileListUtil類定義中:QXmlStreamWriter *writer; writer->writeStartDocument(); writer->writeDTD("<!DOCTYPE medialplayer_list>"); writer->writeStartElement("fileslist"); writer->writeAttribute("version", "1.0"); for (int i = 0; i < list.size(); ++i){ // writer->writeStartElement("file"); writer->writeTextElement("file",list.at(i));//已經包含前後的標記,所以注釋掉上面的和下面的2行代碼 // writer->writeEndElement(); } writer->writeEndElement(); writer->writeEndDocument();}讀操作:QStringList FileListUtil::openFileList(){ //TODO QStringList list; QFile file(fileListName); if (!file.open(QFile::ReadOnly | QFile::Text)) { #ifdef MY_DEBUG QMessageBox::warning(0, tr("Open Meidia Player list failed!"), tr("Cannot read file %1:
%2.") .arg(fileListName) .arg(file.errorString())); #endif emit FileIOError(file.errorString()); } reader->setDevice(&file);//FileListUtil類定義中:QXmlStreamReader *reader; while (!reader->atEnd()) { reader->readNext(); if (reader->isStartElement()) { if (reader->name() == "fileslist" && reader->attributes().value("version") == "1.0") { //read all items readFiles(list); } else reader->raiseError(QObject::tr("The file is not a mediaplayer file list version 1.0 file.")); } } return list;}void FileListUtil::readFiles(QStringList& list){ QString file; while (!reader->atEnd()) { reader->readNext(); if (reader->isStartElement()) { if (reader->name() == "file") { file = reader->readElementText(); list.append(file); }else //not a file element { readUnkownElement(); } }//if is a start element }//while: not end}void FileListUtil::readUnkownElement(){ while (!reader->atEnd()) { reader->readNext(); if (reader->isEndElement()) break; if (reader->isStartElement()) readUnkownElement(); }}操作的文件實例:<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE medialplayer_list><fileslist version="1.0"> <file>/home/yang/code2.tar.gz</file> <file>/home/yang/filelist.xml</file> <file>/home/yang/mspDaemon</file> <file>/home/yang/qt-embedded-linux-opensource-src-4.5.0.tar.gz</file> <file>/home/yang/qt-sdk-linux-x86-opensource-2009.01.bin</file> <file>/home/yang/qt-x11-opensource-src-4.5.0.tar.gz</file> <file>/home/yang/qtanimationframework-2.0-opensource.tar.gz</file></fileslist>
推薦閱讀:

(12)子平門筆記(46):論女命八格奧旨
讓生活更有趣,不可少的手帳筆記神器!
(1)孫軍暉舞蹈班學舞筆記
Python數據分析學習(1)
讀《解深密經》筆記

TAG:筆記 |