在xml文件中的所有文字都會被解析器解析。
只有在cdata部件之內的文字會被解析器忽略。
xml 解析器通常情況下會處理xml文件中的所有文字。
當xml元素被解析的時候,xml元素內部的文字也會被解析:
this text is also parsed
xml解析器這樣做的原因是xml元素內部可能還包含了別的元素,象下面的例子,name元素內部包含了first和last兩個元素:
billgates
解析器會認為上面的**是這樣的:
billgates
不合法的xml字元必須被替換為相應的實體。
如果在xml文件中使用類似"<" 的字元, 那麼解析器將會出現錯誤,因為解析器會認為這是乙個新元素的開始。所以不應該象下面那樣書寫**:
if salary < 1000 then
為了避免出現這種情況,必須將字元"<" 轉換成實體,象下面這樣:
if salary < 1000 then
下面是五個在xml文件中預定義好的實體:
<
<
小於號>
>
大於號&&和
''
單引號"
"雙引號
實體必須以符號"&"開頭,以符號";"結尾。
注意: 只有"<" 字元和"&"字元對於xml來說是嚴格禁止使用的。剩下的都是合法的,為了減少出錯,使用實體是乙個好習慣。
在cdata內部的所有內容都會被解析器忽略。
如果文字包含了很多的"<"字元和"&"字元——就象程式**一樣,那麼最好把他們都放到cdata部件中。
乙個 cdata 部件以""標記結束:
在前面的例子中,所有在cdata部件之間的文字都會被解析器忽略。
cdata部件之間不能再包含cdata部件(不能巢狀)。如果cdata部件包含了字元"]]>" 或者"同樣要注意在字串"]]>"之間沒有空格或者換行符。
xml的語法規則既簡單又嚴格,非常容易學習和使用。
正因為如此,編寫讀取和操作xml的軟體也是相對容易的事情。
乙個xml文件的例子
xml文件使用了自描述的和簡單的語法。
<?xml version="1.0" encoding="iso-8859-1"?>
linordm
reminder
don』t forget me this weekend!
文件的第1行:xml宣告——定義此文件所遵循的xml標準的版本,在這個例子裡是1.0版本的標準,使用的是iso-8859-1 (latin-1/west european)字符集。
文件的第2行是根元素(就象是說「這篇文件是乙個便條」):
文件的第3--6行描述了根元素的四個子節點(to, from, heading,和 body):
linordm
reminder
don』t forget me this weekend!
文件的最後一行是根元素的結束:
你能從這個文件中看出這是ordm給lin留的便條麼?難道能不承認xml是一種美麗的自描述語言麼?
所有的xml文件必須有乙個結束標記
在xml文件中, 忽略結束標記是不符合規定的。
在html文件中,一些元素可以是沒有結束標記的。下面的**在html中是完全合法的:
this is a paragraph
this is another paragraph
但是在xml文件中必須要有結束標記,象下面的例子一樣:
this is a paragraph
this is another paragraph
注意: 你可能已經注意到了,上面例子中的第一行並沒有結束標記。這不是乙個錯誤。因為xml宣告並不是xml文件的一部分,他不是xml元素,也就不應該有結束標記。
xml標記都是大小寫敏感的
這與html不一樣, xml標記是大小寫敏感的。
在xml中, 標記與標記是兩個不同的標記。
因此在xml文件中開始標記和結束標記的大小寫必須保持一致。
this is incorrect //錯誤的
this is correct //正確的
所有的xml元素必須合理包含
在xml中不允許不正確的巢狀包含。
在html中,允許有一些不正確的包含,例如下面的**可以被瀏覽器解析:
this text is bold and italic
在xml中所有元素必須正確的巢狀包含,上面的**應該這樣寫:
this text is bold and italic
所有的xml文件必須有乙個根元素
xml文件中的第乙個元素就是根元素。
所有xml文件都必須包含乙個單獨的標記來定義,所有其他元素的都必須成對的在根元素中巢狀。xml文件有且只能有乙個根元素。
所有的元素都可以有子元素,子元素必須正確的巢狀在父元素中,下面的**可以形象的說明:
.....
屬性值必須使用引號""
在xml中,元素的屬性值沒有引號引著是不符合規定的。
如同html一樣,xml元素同樣也可以擁有屬性。xml元素的屬性以名字/值成對的出現。xml語法規範要求xml元素屬性值必須用引號引著。請看下面的兩個例子,第乙個是錯誤的,第二個是正確的。
<?xml version="1.0" encoding="iso-8859-1"?>
linordm
reminder
don』t forget me this weekend!
<?xml version="1.0" encoding="iso-8859-1"?>
tove
jani
reminder
don』t forget me this weekend!
xml元素是可以擴充套件的,它們之間有關聯。
xml元素有簡單的命名規則。
xml元素是可以擴充套件的
xml文件可以被擴充套件一邊攜帶更多的資訊。
請看下面的xml便條例子:
linordm
don』t forget me this weekend!
讓我們來設想乙個能夠讀取此xml文件的並能解讀其中xml元素(, , 和)的軟體,可能的輸出如下:
message
to: lin
from: ordm
don』t forget me this weekend!
我們再來設想,如果便條的作者ordm在這個xml文件中加入一些額外的資訊,如下所示:
2002-12-24
linordm
reminder
don』t forget me this weekend!
那麼原來的應用程式會中斷或者崩潰麼?
不會。應用程式仍然會正確的解讀, , 和等元素,並且產生同樣的輸出。
xml文件是可以擴充套件的!
xml元素是相互關聯的
xml元素之間是父元素和子元素的關係。
為了更好的理解xml術語,必須了解xml元素之間的關係如何,以及元素的內容是如何被描述的。
設想有這樣一本書:
署名: xml 指南
第一章: xml入門簡介
什麼是html
什麼是xml
第二章: xml語法
xml元素必須有結束標記
xml元素必須正確的巢狀
我們可以用xml文件來描述這本書:
xml 指南
xml入門簡介
什麼是html
什麼是xml
xml語法
xml元素必須有結束標記
xml元素必須正確的巢狀
符合語法的xml文件稱為結構良好的xml文件。
通過dtd驗證的xml文件稱為有效的xml文件。
"結構良好的" xml文件
乙個結構良好的xml文件應該使用正確的語法。
乙個結構良好的xml文件應該遵守xml語法規則,前面一章給出的例子就是乙個結構良好的xml文件:
<?xml version="1.0" encoding="iso-8859-1"?>
tove
jani
reminder
don』t forget me this weekend!
"有效的" xml文件
乙個有效的xml文件應該遵守dtd的描述。
乙個有效的xml文件也是乙個結構良好的xml文件,同時還必須符合dtd的規則。
<?xml version="1.0" encoding="iso-8859-1"?>
tove
jani
reminder
don』t forget me this weekend!
xml dtd
dtd定義了xml文件中可用的合法元素。
xml schema
xml schema(xml模式)是基於xml的dtd的替代品。
w3c使得dtd和schema可以相互替代,讀者可以在schema 指南中了解到更多資訊。
錯誤 xml文件中發生的錯誤將導致xml程式停止。
w3c的xml規範宣告:如果程式在處理xml文件中發現乙個有效的錯誤,那麼此程式應該終止。這就是xml軟體相對於容易編寫的原因。所有的xml文件地都應該是協調一致的。
在html中,html檔案可能包含很多錯誤,(比如乙個元素有開始標記沒有結束標記)這也是html瀏覽器體積之所以很大的乙個原因,當他們發現錯誤的時候,他們有各自不同的方法來決定此html檔案應該如何顯示。
在xml中決不會發生這種情況。
什麼是XML(轉貼)
什麼是xml?正象html一樣,可擴充套件置標語言xml extensible markup language 也是一種置標語言。它同樣依賴於描述一定規則的標籤和能夠讀懂這些標籤的應用處理工具來發揮它的強大功能。這一點,從xml的命名上也可窺見一斑。extensible markup languag...
XML基礎知識介紹 XML基礎
xml extensible markup language 即可擴充套件標記語言 xml是internet環境中跨平台的 依賴於內容的技術,是當前處理結構化文件資訊的有力工具 xml語言有如下特點 1.xml的結構和基礎語法 在乙個xml文件裡包含如下的要素 1 xml宣告 處理指令的一種,乙個x...
vc中通過MSXML操作XML檔案 轉貼
對xml檔案操作的時候,先安裝xml解析器,並要到進行初始話,然後就可以用下面的封裝好的類對xml檔案進行讀和寫的操作了.初始話很簡單 和ado的初始話工作類似 下邊以基於對話方塊的工程 test 為例,進行初始話 只要在test.cpp的initinstance 方法中加入 afxoleinit ...