共用方式為


使用 Visual C# 從 URL 讀取 XML 數據

本文說明如何使用 XmlTextReader 類別從 URL 讀取 XML。 串流資訊可能來自各種來源,例如來自伺服器、檔案或類別的 TextReader 位元組數據流。

原始產品版本: Visual Studio
原始 KB 編號: 307643

需求

本文假設您已熟悉下列主題:

  • Microsoft Visual Studio
  • XML 術語
  • 建立和讀取 XML
  • URL 和建立 XML 端點

本文參考 .NET Framework 類別庫命名空間 System.Xml

如何從 URL 讀取 XML 數據

此範例使用名為 Books.xml 的檔案。 您可以建立自己的 Books.xml 檔案,或使用 .NET 軟體開發工具包 (SDK) 快速入門隨附的範例檔案。 此檔案也可供下載;如需下載位置,請參閱本文的參考一節中的第一個專案。

  1. Books.xml 檔案複製到 \Inetpub\Wwwroot 您電腦上的資料夾。

  2. 開啟 Visual Studio。

  3. 建立新的 Visual C# 主控台應用程式。 您可以繼續進行 [完成程式碼清單 ] 區段,或繼續執行這些步驟來建置應用程式。

  4. 在命名空間上 System.Xml 指定 using 指示詞,讓您不需要在程式代碼稍後限定 XmlTextReader 類別宣告。 您必須在任何其他宣告之前使用using指示詞。

    using System.Xml;
    
  5. 透過 URL 擷取 XML 資料流。 串流可用來提供裝置的獨立;因此,如果數據流的來源變更,則不需要程序變更。 宣告 URL 的 http://localhost/books.xml 常數。 您將在下一個步驟中搭配 XmlTextReader使用 常數。 將下列程式代碼範例新增至預設類別的主要程式:

    String URLString = "http://localhost/books.xml";
    
  6. 建立 類別的 XmlTextReader 實例,並指定 URL。 一般而言, XmlTextReader 如果您需要以原始數據的形式存取 XML,而不需要檔物件模型 (DOM) 的額外負荷,則會使用 ;因此, XmlTextReader 提供更快速的機制來讀取 XML。 類別 XmlTextReader 具有不同的建構函式,可指定 XML 數據的位置。 下列程式代碼會建立 對象的實例 XmlTextReader ,並將URL傳遞至建構函式:

    XmlTextReader reader = new XmlTextReader (URLString);
    
  7. 讀取 XML。

    注意

    此步驟顯示基本、外部 while 迴圈,以及接下來兩個步驟說明如何使用該迴圈和讀取 XML。

    載入之後, XmlTextReader 執行循序讀取,以跨 XML 數據移動,並使用 Read 方法來取得下一筆記錄。 如果沒有其他記錄,此方法 Read 會傳回 false。

    while (reader.Read())
    {
        // Do some work here on the data.
        Console.WriteLine(reader.Name);
    }
    Console.ReadLine();
    
  8. 檢查節點。 若要處理 XML 數據,每個記錄都有可從 屬性判斷的 NodeType 節點類型。 NameValue 屬性會傳回節點名稱(元素和屬性名稱)和節點值(節點文字)目前節點(或記錄)。 列舉 NodeType 會決定節點類型。 下列範例程式代碼會顯示專案名稱和檔類型。

    注意

    此範例會忽略項目屬性。

    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element: // The node is an element.
                Console.Write("<" + reader.Name);
                Console.WriteLine(">");
                break;
    
            case XmlNodeType.Text: //Display the text in each element.
                Console.WriteLine (reader.Value);
                break;
    
            case XmlNodeType.EndElement: //Display the end of the element.
                Console.Write("</" + reader.Name);
                Console.WriteLine(">");
                break;
        }
    }
    
  9. 檢查屬性。 元素節點類型可以包含與其相關聯的屬性節點清單。 方法會 MovetoNextAttribute 循序移動元素中的每個屬性。 HasAttributes使用屬性來測試節點是否有任何屬性。 屬性 AttributeCount 會傳回目前節點的屬性數目。

    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element: // The node is an element.
                Console.Write("<" + reader.Name);
    
                while (reader.MoveToNextAttribute()) // Read the attributes.
                    Console.Write(" " + reader.Name + "='" + reader.Value + "'");
                Console.Write(">");
                Console.WriteLine(">");
                break;
            case XmlNodeType.Text: //Display the text in each element.
                Console.WriteLine (reader.Value);
                break;
            case XmlNodeType. EndElement: //Display the end of the element.
                Console.Write("</" + reader.Name);
                Console.WriteLine(">");
                break;
        }
    }
    
  10. 建置並執行專案。

列出完整的程式碼清單

using System;
using System.Xml;

namespace ReadXMLfromURL
{
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
        static void Main(string[] args)
        {
            String URLString = "http://localhost/books.xml";
            XmlTextReader reader = new XmlTextReader (URLString);

            while (reader.Read())
            {
                switch (reader.NodeType)
                {
                    case XmlNodeType.Element: // The node is an element.
                        Console.Write("<" + reader.Name);

                        while (reader.MoveToNextAttribute()) // Read the attributes.
                            Console.Write(" " + reader.Name + "='" + reader.Value + "'");
                        Console.Write(">");
                        Console.WriteLine(">");
                        break;
                    case XmlNodeType.Text: //Display the text in each element.
                        Console.WriteLine (reader.Value);
                        break;
                    case XmlNodeType. EndElement: //Display the end of the element.
                        Console.Write("</" + reader.Name);
                        Console.WriteLine(">");
                        break;
                }
            }
        }
    }
}

範例輸出

<bookstore>
    <book genre="autobiography" publicationdate="1981" ISBN="1-861003-11-0">
        <title>
        The Autobiography of Benjamin Franklin
        </title>
        <author>
            <first-name>
            Benjamin
            </first-name>
            <last-name>
            Franklin
            </last-name>
        </author>
        <price>
        8.99
        </price>
    </book>
    <book genre="novel" publicationdate="1967" ISBN="0-201-63361-2">>
        <title>
        The Confidence Man
        </title>
        <author>
            <first-name>
            Herman
            </first-name>
            <last-name>
            Melville
            </last-name>
        </author>
        <price>
        11.99
        </price>
    </book>
    <book genre="philosophy" publicationdate="1991" ISBN="1-861001-57-6">
        <title>
        The Gorgias
        </title>
        <author>
            <name>
            Plato
            </name>
        </author>
        <price>
        9.99
        </price>
    </book>
</bookstore>

疑難排解

當您測試程式代碼時,可能會收到下列例外狀況錯誤訊息:

System.Xml.XmlException 類型的未處理例外狀況發生在system.xml.dll其他資訊:非預期的 XML 宣告。 XML 宣告必須是檔中的第一個節點,而且不允許在它之前出現空格符。 第 1 行,位置 4。

例外狀況錯誤發生在下列程式代碼行上。

while (reader.Read())

若要解決例外狀況錯誤,請移除Books.xml檔中第一個節點前面的空格符。

參考資料