Silverlight 2使用C#遍歷XML(兼容Silverlight3)

在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
 
 
   
    海外劇場
    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;                                 break;                             case "AUTHOR":                                 item.author = itemReader.Value;                                 break;                             case "EMAIL":                                 item.email = itemReader.Value;                                 break;                             case "MODIFIED":                                 item.modified = itemReader.Value;                                 break;                         }                     }                     //讀取完成,再讀結束節點End Element                     itemReader.Read();                 }             }         }     } }
相關文章
相關標籤/搜索