Страница 1 из 2
Пример чтения данных из XML-файла
Добавлено: 23 сен 2010, 17:07
Decoder
Всем привет.
Хотелось бы увидеть небольшой пример на Visual C++ с использованием данных из XML-файла.
К примеру: имеется некий файл Hello.xml
[HTML]
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<HELLO>Привет, народ!</HELLO>
</ROOT>
[/HTML]Как мне в нём получить строку из тега HELLO?
Re: Пример чтения данных из XML-файла
Добавлено: 23 сен 2010, 17:13
BulldozerBSG
Используй одну из библиотек tinyxml, expat, libxml2
Re: Пример чтения данных из XML-файла
Добавлено: 23 сен 2010, 17:57
Romeo
Если на Windows, то ещё вариант msxml. Им чаще всего пользуются, если не нужно заботиться о кроссплатформенности кода. Если кроссплатформенный вариант - то xerces.
Обе библиотеки поддерживают весь стандарт XML, включая доступ по XPath, валидация по DTD/XSD, преобразования XSLT и так далее. Если этого всего не нужно, а лишь хочется вытащить из тага текст, то вполне возможно более хорошо с точки зрения производительности будет использоваться что-нибудь маленькое и, как следствие более быстрое, например tinyxml, как указал BulldozerBSG.
Re: Пример чтения данных из XML-файла
Добавлено: 23 сен 2010, 21:16
WinMain
Вот как-то так...
Код: Выделить всё
#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;
}
Re: Пример чтения данных из XML-файла
Добавлено: 24 сен 2010, 10:20
Decoder
WinMain, ты для меня специально код написал?
Спасибо тебе огромное.

Re: Пример чтения данных из XML-файла
Добавлено: 13 мар 2016, 20:37
jay.k
я только начал изучение с++ и прошу помощи, как будет выглядеть аналогичный код чтения из XML-файла в dev C++ для консольного приложения? плиз хелп гуру...
Re: Пример чтения данных из XML-файла
Добавлено: 13 мар 2016, 20:49
Absurd
Вряд ли новичок сможет использовать технологию COM (msxml) в семействе компиляторов GNU (dev c++). Не уверен что это вообще возможно. Лучше использовать expat или tinyxml.
Re: Пример чтения данных из XML-файла
Добавлено: 13 мар 2016, 20:56
jay.k
Absurd писал(а):Вряд ли новичок сможет использовать технологию COM (msxml) в семействе компиляторов GNU (dev c++). Не уверен что это вообще возможно. Лучше использовать expat или tinyxml.
спасибо что откликнулись! а какой самый простой способ прочесть "Привет, народ!" из этого xml файла?
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
<HELLO>Привет, народ!</HELLO>
</ROOT>
Re: Пример чтения данных из XML-файла
Добавлено: 14 мар 2016, 01:42
Absurd
Когда мне приходилось читать xml из C++ я использовал expat и делал на нем конечный автомат.
Re: Пример чтения данных из XML-файла
Добавлено: 14 мар 2016, 12:04
WinMain
Библиотеки типа Expat, LibXml2, и другие - это в основном набор функций для языка СИ. Ими не так удобно пользоваться, как готовыми классами С++. Поэтому лучше сразу поискать классы-обёртки для этих библиотек или попытаться подключить в проект целый фрэймворк, в котором уже имеются классы для работы с XML.
Вот как это можно сделать с помощью кросс-платформенного фрэймворка
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;
}