В настоящее время вы работаете в автономном режиме; ожидается повторное подключение к Интернету

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

Данная статья была ранее опубликована под номером RU301228
Заявление об отказе относительно содержимого статьи о продуктах, поддержка которых прекращена
Эта статья содержит сведения о продуктах, поддержка которых корпорацией Майкрософт прекращена. Поэтому она предлагается как есть и обновляться не будет.
Данная статья ссылается на следующие пространства имен Microsoft .NET Framework Class Library:
  • System.Xml
  • System.IO

Содержание

Аннотация
В данной статье описывается использование класса "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.XmlImports System.IO
    Для C#
    using System.Xml;using System.IO;
  5. Создайте или откройте XML поток. Поток - абстрактное представление устройства ввода или вывода, которое является источником или адресатом для данных (XML-данных, в данном случае). Вы можете использовать поток для чтения и записи данных.

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

      Объект "StringReader" читает символы из строки и принимает строковое значение при создании.Для Visual Basic .NET
      Dim stream as System.IO.StringReaderstream = 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.NodeTypeCase 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 SelectLoop
    Для 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.NodeTypeCase XmlNodeType.Element ' Начало отображения элементов.Console.Write("<" + reader.Name)         If reader.HasAttributes Then 'Если есть атрибуты         While reader.MoveToNextAttribute()'Отображение имени и значения атрибута.Console.Write(" {0}='{1}"', reader.Name, reader.Value)End WhileEnd IfConsole.WriteLine(">")Case XmlNodeType.Text 'Отображение текста каждого элемента.Console.WriteLine(reader.Value)Case XmlNodeType.EndElement 'Завершение отображения элементов.Console.Write("</" + reader.Name)Console.WriteLine(">")End SelectLoop
    Для 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.XmlImports System.IOModule 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 SubEnd 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 по следующему адресу:За дополнительной информацией о классах "XmlReader", "StreamReader" и "StringReader" обратитесь к сайту Microsoft .NET Framework Class Library по следующему адресу:

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

К началу статьи
dotnet xml
Свойства

Номер статьи: 301228 — последний просмотр: 11/02/2001 11:00:00 — редакция: 2.1

  • Microsoft .NET Framework 1.1
  • kbhowto kbhowtomaster kbxml tslic_tslic KB301228
Отзывы и предложения