Как прочитать данные в формате XML из потока

Переводы статьи Переводы статьи
Код статьи: 301228 - Vizualiza?i produsele pentru care se aplic? acest articol.
Данная статья была ранее опубликована под номером RU301228
Развернуть все | Свернуть все

В этой статье

Аннотация

В данной статье описывается использование класса "XmlTextReader" для чтения данных из потока. Потоковая информация может поступать из различных источников, например, поток байтов с сервера, из файла или класса "TextReader".

Системные требования

В следующем списке представлены рекомендации по подбору необходимого аппаратного и программного обеспечения, сетевой инфраструктуры и пакетов обновления:
  • Microsoft Windows 2000 Professional, Windows 2000 Server, Windows 2000 Advanced Server или Windows NT 4.0 Server
  • Microsoft Visual Studio .NET
В данной статье подразумевается, что вы обладаете достаточными знаниями в следующих областях программирования:
  • Терминология XML
  • Создание и чтение XML-файлов

Как выполнить чтение XML данных из потока

  1. Запустите Visual Studio .NET.
  2. Создайте новый проект приложения типа "Console Application" в Microsoft Visual Basic (VB) или Microsoft Visual C#.

    Примечание: Вы можете выполнить нижеприведенные шаги для создания приложения или перейти непосредственно к разделу 10.
  3. Убедитесь, что проект содержит ссылку на пространства имен "System.Xml" и "System.IO".
  4. Используйте директиву "using" для пространства имен "System.Xml" для того, чтобы у Вас не возникло необходимости использовать полное имя класса "XmlTextReader" в коде позднее. Вы должны использовать команду "using" перед любыми другими объявлениями. Например:
    Для Visual Basic .NET
    Imports System.Xml
    Imports System.IO
    
    Для C#
    using System.Xml;
    using System.IO;
    
  5. Создайте или откройте XML поток. Поток - абстрактное представление устройства ввода или вывода, которое является источником или адресатом для данных (XML-данных, в данном случае). Вы можете использовать поток для чтения и записи данных.

    Потоки используются, чтобы обеспечить независимость от устройства, и поэтому не требуют никаких изменений программы, если, например, источник потока изменен. Есть несколько различных способов создать поток для класса "XmlTextReader". Добавьте следующий код в процедуру "Main" созданного по умолчанию модуля:
    • Пример кода, использующего объект "StringReader":

      Объект "StringReader" читает символы из строки и принимает строковое значение при создании. Для Visual Basic .NET
      Dim stream as System.IO.StringReader
      stream = new StringReader("<?xml version='1.0'?>" & _
      "<!-- This file is a book store inventory. -->" & _
      "<bookstore>" & _
      " <book genre=""autobiography"" 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>" & _
      "</bookstore>")
      
      Для C#
      StringReader stream;
      stream = new StringReader("<?xml version='1.0'?>" +
      "<!-- This file represents a fragment of a book store inventory database. -->" +
      "<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>");
      
    • Пример кода, использующего объект "StreamReader":

      Объект "StreamReader" используется для чтения символов из файла. Конструктор данного объекта принимает в качестве параметра имя открываемого файла:
      Dim stream as System.IO.StreamReader
      ' Загружает XML данные из файла books.xml в новый поток.
      stream = New StreamReader ("books.xml")
      
      Для C#
      System.IO.StreamReader stream = new System.IO.StreamReader ("books.xml");
      
      Обратите внимание, что здесь используется файл Books.xml. Вы можете создать ваш собственный файл Books.xml. Пример файла Books.xml включен в комплект поставки Visual Studio .Net и .Net Framework SDK.

  6. Создайте класс "XmlTextReader" для работы с потоком. Как правило, класс "XmlTextReader" используется, если Вы должны работать с XML как с неструктурированными данными без использования модели верхнего уровня Document Object Model (DOM). Поэтому использование класса "XmlTextReader" обеспечивает более быстрый механизм для чтения XML. Класс "XmlTextReader" имеет различные конструкторы для указания расположения XML данных. Следующий код загружает класс "XmlTextReader" из потока:
    Для Visual Basic .NET
    Dim reader As XmlTextReader = New XmlTextReader (stream)
    
    Для C#
    XmlTextReader reader = null;
    reader = new XmlTextReader (stream);
    
  7. Откройте документ XML. После того, как класс "XmlTextReader" загружен, используйте метод "Read" для получения следующей записи. Метод "Read" последовательно считывает данные из файла до тех пор, пока не будет достигнут конец файла. В конце файла данный метод возвращает значение "False".
    Для Visual Basic .NET
    Do While (reader.Read())
        ' Чтение данных XML.
        Console.WriteLine(reader.Name)
    Loop
    
    ' Чтение данных XML завершено.
    Console.ReadLine() 'Pause
    
    Для C#
    while (reader.Read())
    {
        // Некоторые операции с данными.
        ...
    }
    
    while (reader.Read())
    {
        // Некоторые операции с данными.
    Console.WriteLine(reader.Name);
    }
    Console.ReadLine();
    
  8. Исследуйте используемые узлы. Для обработки данных XML каждая запись должна иметь тип узла, который может быть определен свойством "NodeType". Свойства "Name" и "Value" возвращают имя (имя элемента и его атрибуты) и значение (текст узла) текущего узла (или записи). Список "NodeType" определяет тип узла. Следующий пример кода отображает имена элементов и тип документа. Обратите внимание, что в данном примере не учитываются атрибуты элементов.
    Для Visual Basic .NET
    Do While (reader.Read())
    Select Case reader.NodeType
    Case XmlNodeType.Element 'Начало отображения элементов.
    Console.Write("<" + reader.Name)
    Console.WriteLine(">")
    Case XmlNodeType.Text 'Отображение текста каждого элемента.
    Console.WriteLine(reader.Value)
    Case XmlNodeType.EndElement 'Завершение отображения элементов.
    Console.Write("</" + reader.Name)
    Console.WriteLine(">")
    End Select
    Loop
    
    Для C#
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element: // Начало отображения элементов.
                Console.Write("<" + reader.Name);
       Console.WriteLine(">");
                break;
      case XmlNodeType.Text: //Отображение текста каждого элемента.
                Console.WriteLine (reader.Value);
                break;
      case XmlNodeType. EndElement: //Завершение отображения элементов.
                Console.Write("</" + reader.Name);
       Console.WriteLine(">");
                break;
        }
    }
    
  9. Исследуйте используемые атрибуты. Типы узлов элемента могут включать список атрибутов узлов, связанных с ними. Метод "MovetoNextAttribute" работает последовательно с каждым атрибутом элемента. Используйте свойство "HasAttributes" для определения узлов, имеющих атрибуты. Метод "AttributeCount" возвращает количество атрибутов для текущего узла.
    Для Visual Basic .NET
    Do While (reader.Read())
    Select Case reader.NodeType
    Case XmlNodeType.Element ' Начало отображения элементов.
    Console.Write("<" + reader.Name)
             If reader.HasAttributes Then 'Если есть атрибуты
             While reader.MoveToNextAttribute()
    'Отображение имени и значения атрибута.
    Console.Write(" {0}='{1}"', reader.Name, reader.Value)
    End While
    End If
    Console.WriteLine(">")
    Case XmlNodeType.Text 'Отображение текста каждого элемента.
    Console.WriteLine(reader.Value)
    Case XmlNodeType.EndElement 'Завершение отображения элементов.
    Console.Write("</" + reader.Name)
    Console.WriteLine(">")
    End Select
    Loop
    
    Для C#
    while (reader.Read())
    {
        switch (reader.NodeType)
        {
            case XmlNodeType.Element: // Начало отображения элементов.
                Console.Write("<" + reader.Name);
    
                while (reader.MoveToNextAttribute()) // Чтение атрибутов.
                    Console.Write(" " + reader.Name + "="' + reader.Value + ""');
                Console.Write(">");
       Console.WriteLine(">");
                break;
      case XmlNodeType.Text: //Отображение текста каждого элемента.
                Console.WriteLine (reader.Value);
                break;
      case XmlNodeType. EndElement: //Завершение отображения элементов.
                Console.Write("</" + reader.Name);
       Console.WriteLine(">");
                break;
        }
    }
    

  10. Далее приводится полный листинг кода для вашего удобства.
    Для Visual Basic .NET
    Imports System.Xml
    Imports System.IO
    Module Module1
    
        Sub Main()
            Dim stream As System.IO.StreamReader
            ' Загрузка XML-данных из файла books.xml в новый поток.
            stream = New StreamReader("books.xml")
            Dim reader As XmlTextReader = New XmlTextReader(stream)
            Do While (reader.Read())
                Select Case reader.NodeType
                    Case XmlNodeType.Element 'Начало отображения элементов.
                        Console.Write("<" + reader.Name)
                        If reader.HasAttributes Then 'Если есть атрибуты
                            While reader.MoveToNextAttribute()
                                'Отображение имени и значения атрибута.
                                Console.Write(" {0}='{1}'", reader.Name, reader.Value)
                            End While
                        End If
                        Console.WriteLine(">")
                    Case XmlNodeType.Text 'Отображение текста каждого элемента.
                        Console.WriteLine(reader.Value)
                    Case XmlNodeType.EndElement 'Завершение отображения элементов.
                        Console.Write("</" + reader.Name)
                        Console.WriteLine(">")
                End Select
            Loop
        End Sub
    
    End Module
    

    Для C#
    using System;
    using System.Xml;
    using System.IO;
    namespace ReadXMLFromStream
    {
    /// <summary>
    /// Summary description for Class1.
    /// </summary>
    class Class1
    {
    static void Main(string[] args)
    {
    
    System.IO.StreamReader stream = new System.IO.StreamReader ("books.xml");
    XmlTextReader reader = null;
    reader = new XmlTextReader (stream);
    while (reader.Read())
    {
    switch (reader.NodeType)
    {
    case XmlNodeType.Element: //Начало отображения элементов.
    Console.Write("<" + reader.Name);
    
    while (reader.MoveToNextAttribute()) // Чтение атрибутов
    Console.Write(" " + reader.Name + "="' + reader.Value + "'");
    Console.Write(">");
    Console.WriteLine(">");
    break;
    case XmlNodeType.Text: //Отображение текста каждого элемента.
    Console.WriteLine (reader.Value);
    break;
    case XmlNodeType. EndElement: //Завершение отображения элементов.
    Console.Write("</" + reader.Name);
    Console.WriteLine(">");
    break;
    }
    }
    
    }
    }
    }
    
  11. Сохраните и закройте проект.

Ссылки

За дополнительной информацией обратитесь к статье "XML in Microsoft .NET: .NET Framework XML Classes and C# Offer Simple, Scalable Data Manipulation" в журнале MSDN Magazine по следующему адресу:
http://msdn.microsoft.com/library/periodic/period01/xml0101.htm
За дополнительной информацией о классах "XmlReader", "StreamReader" и "StringReader" обратитесь к сайту Microsoft .NET Framework Class Library по следующему адресу:

За дополнительной информацией об использовании класса "XmlReader" для чтения данных XML обратитесь к документации Microsoft .NET Framework Developer's Guide.

Свойства

Код статьи: 301228 - Последний отзыв: 2 ноября 2001 г. - Revision: 2.1
Информация в данной статье относится к следующим продуктам.
  • Microsoft .NET Framework 1.1
Ключевые слова: 
kbhowto kbhowtomaster kbxml tslic_tslic KB301228
Заявление об отказе относительно содержимого статьи о продуктах, поддержка которых прекращена
Эта статья содержит сведения о продуктах, поддержка которых корпорацией Майкрософт прекращена. Поэтому она предлагается как есть и обновляться не будет.

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com