Чтение XML-данных из файла с помощью Visual C++

В этой статье показано, как использовать XmlTextReader класс для чтения XML-данных из файла.

Исходная версия продукта: Visual C++
Исходный номер базы знаний: 815658

Сводка

В этой статье описывается использование XmlTextReader класса для чтения XML-данных из файла. Класс XmlTextReader обеспечивает прямой синтаксический анализ и токенизацию XML-данных. Класс XmlTextReader также реализует спецификацию XML 1.0 в дополнение к пространствам имен в спецификации XML, определенной консорциумом W3C. В этой статье описывается, как быстро получить доступ к XML-данным с маркерами, а не использовать объектную модель, например объектную модель xml-документа (DOM).

Сведения о версии Microsoft Visual C# для .NET этой статьи см. в статье Чтение XML из файла с помощью Visual C#.

В этой статье описывается следующее пространство имен библиотеки классов Microsoft платформа .NET Framework:System.xml

Требования

В этой статье предполагается, что вы знакомы со следующими разделами:

  • Терминология XML
  • Создание и чтение XML-файла

В следующем списке описаны рекомендуемые оборудование, программное обеспечение, сетевая инфраструктура и пакеты обновления.

  • Microsoft Visual Studio .NET
  • Microsoft Visual Studio 2005

Чтение XML-данных из файла

В примере в этой статье используется файл с именем Books.xml. Вы можете создать собственный файл Books.xml или использовать пример файла, который входит в краткие руководства по пакету SDK для Microsoft .NET. Необходимо скопировать файл Books.xml в папку проекта.

Чтобы считывать XML-данные из файла, выполните следующие действия.

  1. Запустите Visual Studio .NET 2002, Visual Studio .NET 2003 или Visual Studio 2005.

  2. В меню Файл выберите пункт Создать и затем пункт Проект.

    Открывается диалоговое окно Новый проект.

  3. В разделе Типы проектов щелкните Проекты Visual C++.

    Примечание.

    В Visual Studio 2005 проекты Visual C++ изменены на Visual C++.

  4. В разделе Шаблоны щелкните Управляемое приложение C++ , если вы используете Visual Studio .NET 2002.

    В разделе Шаблоны щелкните Консольное приложение (.NET), если вы используете Visual Studio .NET 2003.

    В разделе Шаблоны щелкните Консольное приложение CLR , если вы используете Visual Studio 2005.

  5. В поле Имя введите Q815658 и нажмите кнопку ОК.

  6. Добавьте ссылку на System.xml.dll в проекте. Дополнительные сведения о добавлении ссылок на управляемый проект Visual C++ см. в статье Добавление ссылок на управляемый проект Visual C++

  7. Укажите директиву using в System::Xml пространстве имен следующим образом:

    using namespace System::Xml;
    

    Это делается так, чтобы не нужно было квалифицировать XmlTextReader объявления классов позже в коде. Директиву using необходимо использовать перед любыми другими объявлениями.

  8. Создайте экземпляр XmlTextReader объекта . XmlTextReader Заполните объект файлом .xml.

    Как правило, класс используется, XmlTextReader если требуется доступ к необработанным XML-данным без дополнительных затрат на DOM. Таким образом XmlTextReader , класс обеспечивает более быстрый способ чтения XML-данных. Класс XmlTextReader отличается constructors , задающими расположение XML-данных.

    Следующий код создает экземпляр XmlTextReader класса , а затем загружает файлBooks.xml . Добавьте следующий код в функцию _tmain :

    XmlTextReader* reader = new XmlTextReader ("books.xml");
    

    Примечание.

    В Visual C++ 2005 _tmain функция изменяется на функцию main.

  9. Чтение XML-данных.

    Примечание.

    На этом шаге показан внешний цикл while . В двух шагах, которые следуют за этим шагом, показано, как использовать цикл while для чтения XML-данных.

    После создания XmlTextReader объекта используйте метод Read для чтения XML-данных.

    Метод Read продолжает последовательно перемещаться по файлу .xml, пока метод Read не достигнет конца файла. Когда метод Read достигает конца файла, метод Read возвращает значение false.

    while (reader->Read())
    {
        // Do some work here on the data.
        Console::WriteLine(reader->Name);
    }
    
  10. Проверьте узлы.

    Для обработки XML-данных каждая запись имеет тип узла, который можно определить из NodeType свойства . Свойство Name и Value свойство возвращают следующие сведения для текущего узла или для текущей записи:

    • Имя узла, которое является именем элемента и именем атрибута.
    • Значение узла, которое является текстом узла.

    Перечисление NodeType определяет тип узла. В следующем примере кода отображается имя элементов и тип документа. Следующий пример кода игнорирует атрибуты элемента:

    while (reader->Read())
    {
        switch (reader->NodeType)
        {
            case XmlNodeType::Element: // The node is an element.
                Console::Write("<{0}", 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("</{0}", reader->Name);
                Console::WriteLine(">");
                break;
        }
    }
    
  11. Изучите атрибуты.

    Типы узлов элементов могут включать список узлов атрибутов, связанных с типами узлов элементов. Метод MovetoNextAttribute последовательно перемещается по каждому атрибуту в элементе . Используйте свойство , HasAttributes чтобы проверить, есть ли у узла какие-либо атрибуты. Свойство AttributeCount возвращает количество атрибутов для текущего узла.

    while (reader->Read())
    {
        switch (reader->NodeType)
        {
            case XmlNodeType::Element: // The node is an element.
                Console::Write("<{0}", reader->Name);
    
                while (reader->MoveToNextAttribute()) // Read the attributes.
                    Console::Write(" {0}='{1}'", reader->Name, reader->Value);
                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("</{0}", reader->Name);
                Console::WriteLine(">");
                break;
        }
    }
    
  12. Сохраните решение. Построение решения.

  13. Нажмите клавиши CTRL+F5, чтобы запустить пример приложения.

Просмотрите полный список кода в Visual Studio .NET 2002 или Visual Studio .NET 2003

#include "stdafx.h"
#include <tchar.h>

#using <mscorlib.dll>
#using <System.xml.dll>

using namespace System;
using namespace System::Xml;

void _tmain(void)
{
    XmlTextReader* reader = new XmlTextReader ("books.xml");

    while (reader->Read())
    {
        switch (reader->NodeType)
        {
            case XmlNodeType::Element: // The node is an element.
                Console::Write("<{0}", reader->Name);
  
                while (reader->MoveToNextAttribute()) // Read the attributes.
                    Console::Write(" {0}='{1}'", reader->Name, reader->Value);
                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("</{0}", reader->Name);
                Console::WriteLine(">");
                break;
        }
    }
    Console::ReadLine();
}

Примечание.

Чтобы успешно скомпилировать предыдущий пример кода, необходимо добавить параметр компилятора поддержки среды CLR (/clr:oldSyntax) в Visual C++ 2005. Чтобы добавить параметр компилятора поддержки среды CLR в Visual C++ 2005, выполните следующие действия.

  1. Щелкните Проект, а затем — <Свойства ProjectName> .

    Примечание.

    <ProjectName> — это заполнитель для имени проекта.

  2. Разверните узел Свойства конфигурации, а затем щелкните Общие.

  3. Щелкните , чтобы выбрать поддержка среды CLR, старый синтаксис (/clr:oldSyntax) в параметре проекта поддержки common Language Runtime в правой области, нажмите кнопку Применить, а затем нажмите кнопку ОК.

    Дополнительные сведения о параметре компилятора поддержки среды CLR см. в разделе /clr (компиляция CLR).

Эти действия применимы ко всей статье.

Просмотр примера выходных данных

<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 с помощью XmlReader см. в разделе Чтение XML с помощью XmlReader.