Пример чтения данных из XML-файла
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Всем привет.
Хотелось бы увидеть небольшой пример на Visual C++ с использованием данных из XML-файла.
К примеру: имеется некий файл Hello.xml
[HTML]
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<HELLO>Привет, народ!</HELLO>
</ROOT>
[/HTML]Как мне в нём получить строку из тега HELLO?
Хотелось бы увидеть небольшой пример на Visual C++ с использованием данных из XML-файла.
К примеру: имеется некий файл Hello.xml
[HTML]
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<HELLO>Привет, народ!</HELLO>
</ROOT>
[/HTML]Как мне в нём получить строку из тега HELLO?
Поумнеть несложно, куда труднее от дури избавиться.
-
- Сообщения: 270
- Зарегистрирован: 09 янв 2010, 04:14
- Контактная информация:
Используй одну из библиотек tinyxml, expat, libxml2
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Если на Windows, то ещё вариант msxml. Им чаще всего пользуются, если не нужно заботиться о кроссплатформенности кода. Если кроссплатформенный вариант - то xerces.
Обе библиотеки поддерживают весь стандарт XML, включая доступ по XPath, валидация по DTD/XSD, преобразования XSLT и так далее. Если этого всего не нужно, а лишь хочется вытащить из тага текст, то вполне возможно более хорошо с точки зрения производительности будет использоваться что-нибудь маленькое и, как следствие более быстрое, например tinyxml, как указал BulldozerBSG.
Обе библиотеки поддерживают весь стандарт XML, включая доступ по XPath, валидация по DTD/XSD, преобразования XSLT и так далее. Если этого всего не нужно, а лишь хочется вытащить из тага текст, то вполне возможно более хорошо с точки зрения производительности будет использоваться что-нибудь маленькое и, как следствие более быстрое, например tinyxml, как указал BulldozerBSG.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Вот как-то так...
Код: Выделить всё
#include "stdafx.h"
#include <msxml.h>
#include <conio.h>
struct _CO_INITIALIZE
{
_CO_INITIALIZE()
{
::CoInitialize(NULL);
}
~_CO_INITIALIZE()
{
::CoUninitialize();
}
} co_init;
int _tmain(int argc, _TCHAR* argv[])
{
CComPtr<IXMLDOMDocument> xmlDoc;
xmlDoc.CoCreateInstance(CLSID_DOMDocument);
if (xmlDoc != NULL)
{
VARIANT_BOOL vBool = 0;
HRESULT hr = xmlDoc->load(CComVariant(L"Hello.xml"), &vBool);
if (SUCCEEDED(hr))
{
CComPtr<IXMLDOMNode> xmlNodeHello;
xmlDoc->selectSingleNode(CComBSTR(L"ROOT/HELLO"), &xmlNodeHello);
if (xmlNodeHello != NULL)
{
CComBSTR text;
xmlNodeHello->get_text(&text);
_tcprintf(_T("%s\n"), text);
}
}
}
//
_gettch();
return 0;
}
WinMain, ты для меня специально код написал?
Спасибо тебе огромное.
Спасибо тебе огромное.

Поумнеть несложно, куда труднее от дури избавиться.
я только начал изучение с++ и прошу помощи, как будет выглядеть аналогичный код чтения из XML-файла в dev C++ для консольного приложения? плиз хелп гуру...
Absurd писал(а):Вряд ли новичок сможет использовать технологию COM (msxml) в семействе компиляторов GNU (dev c++). Не уверен что это вообще возможно. Лучше использовать expat или tinyxml.
спасибо что откликнулись! а какой самый простой способ прочесть "Привет, народ!" из этого xml файла?
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<HELLO>Привет, народ!</HELLO>
</ROOT>
Библиотеки типа Expat, LibXml2, и другие - это в основном набор функций для языка СИ. Ими не так удобно пользоваться, как готовыми классами С++. Поэтому лучше сразу поискать классы-обёртки для этих библиотек или попытаться подключить в проект целый фрэймворк, в котором уже имеются классы для работы с XML.
Вот как это можно сделать с помощью кросс-платформенного фрэймворка wxWidgets
Вот как это можно сделать с помощью кросс-платформенного фрэймворка wxWidgets
Код: Выделить всё
#include <iostream>
#include <wx\wx.h>
#include <wx\xml\xml.h>
#include <locale.h>
_TCHAR* lc = _tsetlocale(LC_ALL, _T("russian"));
int _tmain(int argc, _TCHAR* argv[])
{
wxInitializer init(argc, argv);
/* Чтение из XML... */
wxXmlDocument xml(wxT("Hello.xml"));
if (xml.IsOk())
{
wxXmlNode *pRoot = xml.GetRoot();
if (pRoot != NULL)
{
wxXmlNode *pChild = pRoot->GetChildren();
while (pChild != NULL)
{
wxString name = pChild->GetName();
if (name == wxT("HELLO"))
{
wxString text = pChild->GetNodeContent();
wxPrintf(wxT("%s\t"), text);
break;
}
pChild = pChild->GetNext();
}
}
}
cin.get();
//
return 0;
}