天天看點

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 

    海外劇場 

我們用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