在Silverlight 1.1中,C#隻能用XmlReader這樣一個非常輕量級的東西來解析XML,是以稍有不慎就會出現很多非常奇怪的錯誤,在這裡對XML的解析做一個簡單的流程介紹吧。
在對流式XML的解析中,XmlReader對XML節點進行一些區分,這些節點的類型包括:
引用内容:
public enum XmlNodeType
{
None = 0,
Element = 1,
Attribute = 2,
Text = 3,
CDATA = 4,
EntityReference = 5,
Entity = 6,
ProcessingInstruction = 7,
Comment = 8,
Document = 9,
DocumentType = 10,
DocumentFragment = 11,
Notation = 12,
Whitespace = 13,
SignificantWhitespace = 14,
EndElement = 15,
EndEntity = 16,
XmlDeclaration = 17,
}
其中常用到的有Element、Attribite、Text、CDATA、EndElement等。其中Element類型的節點為“”形式,EndElement的的節點為“”形式,而Text類型則可以為一對标記之間的文本内容或者節點之間的空格、換行等。
了解了這些,我們再來看怎麼從一個XML檔案流中找出自己想要的資料。首先假設有一個這樣的XML資料流,其XML結構如下:
引用内容:
熱門動漫
OOboy.net
Thu, 16 Aug 2007 09:39:19 GMT
海外劇場
我們用XmlReader的Create方法從這個Stream中建立了一個XmlReader對象,現在我們解析出想要的資料——item項目中的各個子項:Title、Catalog、Author、Email、Modified。
解析過程在下面代碼的注釋中:
//reader是一個XmlReader執行個體
//開始讀取流,直到讀完為止
//reader.Read()每次讀取一個XML節點(XML節點的描述在本文開頭)
while (reader.Read())
//如果該節點是一個開始節點,而且節點的名稱叫做item
//那麼我們繼續讀取item子樹
if ((reader.IsStartElement()) && (reader.LocalName == "item"))
{
//建立一個新的Item對象,後面把資料儲存到Item對象中
Item item = new Item();
//繼續讀取Item下面的内容
using (XmlReader itemReader = reader.ReadSubtree())
{
//開始讀取Item下面的内容,知道讀完Item子樹為止
//當碰到節點時會跳出循環
while (itemReader.Read())
{
//如果找到一個Element,我們就讀取其中的值
//用這種節點可以忽略空格、回車等等
if (itemReader.NodeType == XmlNodeType.Element)
{
//如果是空節點,比如上文中的這樣的節點
//此時讀取下一個節點,否則會出錯
if (itemReader.IsEmptyElement)
{
continue;
}
//如果不是空節點
//把節點的name記錄下來
string nodeName = itemReader.Name;
//讀取節點内地文本節點
itemReader.Read();
if (itemReader.NodeType == XmlNodeType.Text)
//根據節點的name,把值儲存到Item對應的屬性中
switch (nodeName.ToUpper())
{
case "TITLE":
item.title = itemReader.Value;
break;
case "CATALOG":
item.catalog = itemReader.Value;
case "AUTHOR":
item.author = itemReader.Value;
case "EMAIL":
item.email = itemReader.Value;
case "MODIFIED":
item.modified = itemReader.Value;
}
}
//讀取完成,再讀結束節點End Element
}
}
}
}
本文轉自dotfun 51CTO部落格,原文連結:http://blog.51cto.com/dotfun/285676